Я пытаюсь явно связать с DLL. Нет других доступных ресурсов, кроме самого файла DLL и некоторой документации о классах и их функциях-членах.
Из документации каждый класс поставляется со своим
- член typedef
пример: typedef std::map<std::string,std::string> Server::KeyValueMap, typedef std::vector<std::string> Server::String Array
- перечисление члена
пример: enum Server::Role {NONE,HIGH,LOW}
- функция-член
пример: void Server::connect(const StringArray,const KeyValueMap), void Server::disconnect()
Реализуя коды из поиска Google, мне удается загрузить DLL может вызвать функцию отключения ..
дир.ч
LPCSTR disconnect = "_Java_mas_com_oa_rollings_as_apiJNI_Server_1disconnect@20";
LPCSTR connect =
"_Java_mas_com_oa_rollings_as_apiJNI_Server_1connect@20";
Я получил имя функции выше от зависит от.exe. Это то, что называется в C ++ именами украшенных / искаженных функций?
main.cpp
#include <iostream>
#include <windows.h>
#include <tchar.h>
#include "dir.h"
typedef void (*pdisconnect)();
int main()
{
HMODULE DLL = LoadLibrary(_T("server.dll"));
pdisconnect _pdisconnect;`
if(DLL)
{
std::cout<< "DLL loaded!" << std::endl;
_disconnect = (pdisconnect)GetProcAddress(DLL,disconnect);
if(_disconnect)
{
std::cout << "Successful link to function in DLL!" << std::endl;
}
else
{
std::cout<< "Unable to link to function in DLL!" << std::endl;
}
}
else
{
std::cout<< "DLL failed to load!" << std::endl;
}
FreeLibrary (DLL);
return 0;}
Как мне вызвать (например) функцию connect , которая имеет тип данных параметра, объявленный в самой dll?
Редактировать
больше информации:
- DLL поставляется с примером реализации с использованием Java. Пример Java содержит оболочку Java, созданную с использованием SWIG, и исходный код.
- В документации перечислены все классы, их функции-члены, а также их типы данных. Согласно документу, список был сгенерирован из исходных кодов C ++. (??)
- Никакой другой информации не было предоставлено (никакой информации о том, какой компилятор использовался для генерации DLL)
Мой коллега реализует интерфейс с использованием Java на основе приведенного примера Java, в то время как меня попросили реализовать с использованием C ++. DLL от сторонней компании.
Я спрошу их о компиляторе. Любая другая информация, которую я должен получить от них?
Я быстро прочитал о JNI, но я не понимаю, как это реализовано в этом случае.
Update
Я немного смущен ... (хорошо, хорошо ... очень смущен)
- Вызываю ли я (GetProcAddress) каждую публичную функцию-член отдельно, только когда я хочу их использовать?
- Создать ли фиктивный класс, который имитирует класс в dll. Затем внутри определения класса я вызываю эквивалентную функцию из DLL? (Имею ли я здесь смысл?) Fnieto, это то, что вы показываете мне в конце своего поста?
- Можно ли создать экземпляр всего класса из DLL?
Я пытался использовать функцию подключения, описанную в моем первом посте. Из вывода DLL-файла Depends.exe
- std :: map // KeyValueMap имеет следующие функции-члены: del, empty, get, has_1key, set
- std :: vector // StringArray имеет следующие функции-члены: добавить, емкость, очистить, получить, isEMPTY, резерв, установить, размер
, который отличается от функций-членов map и vector в моем компиляторе (VS 2005) ...
Есть идеи? или я здесь получаю неправильную картину ...