Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

23.06.2014, 21:16. Просмотров 632. Ответов 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 - Модуль не найден, хотя он там лежит. Полагаю, что что-то не так в коде ... Но вот что?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.06.2014, 21:16
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Динамическое подключение VC++ (2012) DLL в приложении C++Builder (RAD XE5) (C++):

Указатели в VC++ (2010) DLL и в приложении C++Builder (RAD XE4) - C++
Здравствуйте! Есть такая ситуация: в приложении происходит вызов функции из библиотеки, в которую надо передать vector<wchar_t*>*. Когда...

Динамическое подключение DLL - C++
Здравствуйте! Скорее всего, мой вопрос покажется вам глупым, но всё же... Я не могу динамически подключить библиотеку. Когда подключаю...

Программа которую написали в Embarcadero Rad Studio 10 откроется в C++ Builder 6? - C++
Программа которую написали в Embarcadero Rad Studio 10 откроется в C++ Builder 6?

Динамическое подключение сишных dll в приложении c# - C#
Здравствуйте коллеги. Столкнулся вот с какой проблемой:есть у меня приложение .net, в котором я подключаю стороннюю dll написанную на си;...

С++ Builder Клиент-Сервер, RAD Studio XE5 - C++ Builder
Здравствуйте. Создаю приложение "Клиент-Сервер". Прочитал много статей на форумах, как можно это реализовать, но не чего полезного для RAD...

Установка дополнительных компонентов (RAD Studio XE5 C++ Builder) - C++ Builder
Установил EhLib компоненты без проблем. Но при компиляции нового проекта с этими компонентами просит указать путь. если поставить...

6
MrCold
855 / 753 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
23.06.2014, 21:49 #2
Цитата Сообщение от VV_RIP Посмотреть сообщение
Модуль не найден, хотя он там лежит
Уверены что правильный путь ? Путь проверяли ?
C++
1
2
3
4
5
if(FileExists(path.w_str()))
{
//Ваш код
}
else MessageBox(0,"Файл не найден","Ошибка",0);
потому что с кодом все нормально
0
VV_RIP
9 / 8 / 1
Регистрация: 05.02.2012
Сообщений: 105
25.06.2014, 00:07  [ТС] #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, придется писать дополнительные проверки ...
1
MrCold
855 / 753 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
25.06.2014, 00:10 #4
Цитата Сообщение от VV_RIP Посмотреть сообщение
Ещё фигово то, что есть маленькое различие при загрузке функции из VC++ DLL и C++Bulider DLL
Если нетрудно напишите про различия.
0
VV_RIP
9 / 8 / 1
Регистрация: 05.02.2012
Сообщений: 105
25.06.2014, 00:27  [ТС] #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.
1
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
25.06.2014, 06:28 #6
Цитата Сообщение от VV_RIP Посмотреть сообщение
Т.е. разница в подчеркивании в имени.
Implib -a dll_name.lib dll_name.dll

решал этот вопрос и за одно избавлял от необходимости руками грузить dll и настраивать адреса. Или обязательно динамически?
0
VV_RIP
9 / 8 / 1
Регистрация: 05.02.2012
Сообщений: 105
25.06.2014, 18:14  [ТС] #7
Да, нужно динамически.
0
25.06.2014, 18:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.06.2014, 18:14
Привет! Вот еще темы с ответами:

Создание мобильных приложений в Rad Studio XE5 C++ Builder - C++ Builder FireMonkey
У меня вопрос? Ставил RAD Studio XE 5 C++ Builder Нет меню File > New > FireMonkey Mobile Application - C++Builder наверно есть...

Динамическое программирование (С++ Builder XE5) - C++ Builder
Ребят, очень нужна помощь, программа рабочая, но она написана с помощью циклов, а мне нужно написать её с помощью динамического...

Embarcadero rad studio xe5 программирование под android подключение к mysql - Программирование Android
надо написать приложение которое бы подключалось к mysql удаленно делфи в принципе знаю но вот с андроидом еще не работал кто что подскажет

Можно ли программировать под Borland C++ Builder 6 в Rad Studio 2012 XE3? - C++ Builder
Можно ли программировать под Borland C++ Builder 6 в Rad Studio 2012 XE3? Переформулирую вопрос. Какой компилятор можно использовать...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

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