Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
VV_RIP
9 / 8 / 1
Регистрация: 05.02.2012
Сообщений: 105
#1

Динамическое подключение VC++ (2012) DLL в приложении C++Builder (RAD XE5) - C++

23.06.2014, 21:16. Просмотров 588. Ответов 6
Метки нет (Все метки)

Здравствуйте! Вроде бы подобные темы бывали, но я так и не смог понять, что не так, т.к. редко пишу на с++.
Вот код в библиотеке VC++:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//---------------------------------------------------------------------------
#include "stdafx.h"
#include "Cam.h"
//---------------------------------------------------------------------------
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}
//---------------------------------------------------------------------------
EXPORT int GetID()
{
    return ID;
}
//---------------------------------------------------------------------------
Cam.h:
C++
1
2
3
4
5
6
//---------------------------------------------------------------------------
#define ID 5
#define EXPORT extern "C" __declspec(dllexport)
//---------------------------------------------------------------------------
EXPORT int GetID();
//--------------------------------------------------------------------------
Пытаюсь загрузить либу в C++ Builder:
C++
1
2
HINSTANCE my_dll = LoadLibrary(path.w_str());
    UnicodeString s = GetLastError();//возвращает 126
Ошибка 126 - Модуль не найден, хотя он там лежит. Полагаю, что что-то не так в коде ... Но вот что?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrCold
852 / 750 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
23.06.2014, 21:49     Динамическое подключение VC++ (2012) DLL в приложении C++Builder (RAD XE5) #2
Цитата Сообщение от VV_RIP Посмотреть сообщение
Модуль не найден, хотя он там лежит
Уверены что правильный путь ? Путь проверяли ?
C++
1
2
3
4
5
if(FileExists(path.w_str()))
{
//Ваш код
}
else MessageBox(0,"Файл не найден","Ошибка",0);
потому что с кодом все нормально
VV_RIP
9 / 8 / 1
Регистрация: 05.02.2012
Сообщений: 105
25.06.2014, 00:07  [ТС]     Динамическое подключение VC++ (2012) DLL в приложении C++Builder (RAD XE5) #3
Да, я проверял, все там на месте.

Добавлено через 21 час 29 минут
Да, ещё, т.к. RAD Studio конфликтует с VS, да и она мне не так часто нужна, у меня она стоит на виртуалке (WinXP), а VS на Win7.
Код очень прост, DLL весит 7кб в версии Release.
Может ли быть такое, что DLL, созданная на VS2012, не будет работать на WinXP? Или по крайней мере нужны какие-нибудь библиотеки redistributable новый и т.п.?

Добавлено через 3 часа 57 минут
Печаль беда ... VS 2012 не поддерживает XP, поэтому даже при статической линковке при создании библиотеки будут вылетать ошибки в kernel32.dll(((
Причем ошибка стала вылетать только после перезагрузки виртуалки! Магия, не иначе!
И у меня в свойствах проекта нет набора инструментов для xp ...
.........
Поставил VS 2010 на виртуалку, кое-как создал проект (Пришлось создать сначала пустой проект, потом его превратить в проект для dll), сейчас проблема вот в чем:
LINK : fatal error LNK1561: точка входа должна быть определена

Добавлено через 11 минут
Блин, студия не сохранила тип проекта((((
Ща все изменил и заработало!!!!!
Ещё фигово то, что есть маленькое различие при загрузке функции из VC++ DLL и C++Bulider DLL, придется писать дополнительные проверки ...
MrCold
852 / 750 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
25.06.2014, 00:10     Динамическое подключение VC++ (2012) DLL в приложении C++Builder (RAD XE5) #4
Цитата Сообщение от VV_RIP Посмотреть сообщение
Ещё фигово то, что есть маленькое различие при загрузке функции из VC++ DLL и C++Bulider DLL
Если нетрудно напишите про различия.
VV_RIP
9 / 8 / 1
Регистрация: 05.02.2012
Сообщений: 105
25.06.2014, 00:27  [ТС]     Динамическое подключение VC++ (2012) DLL в приложении C++Builder (RAD XE5) #5
Когда я в билдере гружу функцию из VC++ DLL то:
C++
1
2
3
    HINSTANCE my_dll = LoadLibrary(path.w_str());
int (__stdcall *GetID) ();
GetID = (int(__stdcall *) ()) GetProcAddress(my_dll, "GetID");
Когда из родной DLL:
C++
1
    GetID = (int(__stdcall *) ()) GetProcAddress(my_dll, "_GetID");
Т.е. разница в подчеркивании в имени.

При создании функции в VC++ DLL я писал:
C++
1
    extern "C" __declspec(dllexport) int GetID();
А в с++ builder:
C++
1
2
3
4
 extern "C" int __export GetID()
{
     return ID;
}
Да, ещё маленькая поправочка: я использую RAD Studio XE4, и сейчас на виртуалке она вполне уживается с VS 2010.
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
25.06.2014, 06:28     Динамическое подключение VC++ (2012) DLL в приложении C++Builder (RAD XE5) #6
Цитата Сообщение от VV_RIP Посмотреть сообщение
Т.е. разница в подчеркивании в имени.
Implib -a dll_name.lib dll_name.dll

решал этот вопрос и за одно избавлял от необходимости руками грузить dll и настраивать адреса. Или обязательно динамически?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.06.2014, 18:14     Динамическое подключение VC++ (2012) DLL в приложении C++Builder (RAD XE5)
Еще ссылки по теме:

Динамическое подключение DLL C++
Подключение Dll на С++ к Java и С# C++
Указатели в VC++ (2010) DLL и в приложении C++Builder (RAD XE4) C++
C++ DLL компилируется, но не вызывается в приложении C#
C++ Динамическое связывание DLL

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
VV_RIP
9 / 8 / 1
Регистрация: 05.02.2012
Сообщений: 105
25.06.2014, 18:14  [ТС]     Динамическое подключение VC++ (2012) DLL в приложении C++Builder (RAD XE5) #7
Да, нужно динамически.
Yandex
Объявления
25.06.2014, 18:14     Динамическое подключение VC++ (2012) DLL в приложении C++Builder (RAD XE5)
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru