Я пытаюсь явно связать с DLL. Других ресурсов нет, кроме самого DLL-файла и некоторой документации о классах и его функциях-членах.Явная загрузка DLL
Из документации, каждый класс имеет свой собственный
- член ЬурейеЕ
пример: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 может вызвать функцию отключения ..
dir.h
LPCSTR disconnect = "[email protected]";
LPCSTR connect =
"[email protected]";
Я получил имя функции выше от depends.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;}
Как вызвать (например) подключить функции-члена, который имеет параметр типа данных, объявленные в самой DLL?
Редактировать
подробнее:
- DLL, поставляется с примером реализации с использованием Java. Пример Java содержит оболочку Java, сгенерированную с помощью SWIG и исходного кода.
- В документации перечислены все классы, их функции-члены, а также их типы данных. Согласно документу, список был создан из исходных кодов C++. (??)
- Никакая другая информация не была дана (нет информации о том, что компилятор был использован для создания DLL)
Мой коллега реализации интерфейс с использованием Java на основе приведенного примера Java, в то время как меня попросили реализовать с использованием C++. DLL принадлежит сторонней компании.
Я спрошу их о компиляторе. Любая другая информация, которую я должен получить от них?
Я быстро прочитал о JNI, но я не понимаю, как это реализовано в этом случае.
Update
я немного запутался ... (хорошо, хорошо ... очень смущен)
- ли я называть (GetProcAddress) каждую функцию общественного члена в отдельности, только когда хотите их использовать?
- Я создаю фиктивный класс, который имитирует класс в dll. Затем внутри определения класса я вызываю эквивалентную функцию из DLL? (Я здесь смысл?) Fnieto, это то, что вы показываете мне в конце вашего сообщения?
- Возможно ли создать экземпляр всего класса из DLL?
Я пытался использовать функцию подключения, описанную в моем первом сообщении. С выхода Depends.exe DLL,
- станд :: Карта // KeyValueMap имеет следующие функции-члены: дель, пустой, получить, has_1key установите
- станд :: вектор // StringArray имеет следующие функции-членов: надстройки, емкость, ясно, получить, IsEmpty, резерв, набор, размер
, которая отличается от функций членов карты и вектора в моей компиляции r (VS 2005) ...
Любая идея? или я получаю неправильную картину здесь ...
благодарит за ваш ответ ... Какие еще детали вам нужны? .. Я не уверен, что я подробно должен буду искать. – justin
Ну, в сущности, откуда взялась DLL. Я был бы очень обеспокоен, если бы вы сказали, что это была DLL, переданная вам, и вы не знали, откуда она взялась, или какой компилятор был использован. Я был бы гораздо менее обеспокоен, если бы он был разработан кем-то другим в вашей организации, и вы точно знали, какой компилятор они используют, и вы могли бы скоординировать свои обновления компилятора с другим человеком. Так же, как @fnieto, я не заметил соединение Java Native Interface; У меня нет опыта работы с JNI. –