2009-08-10 4 views
3

Я пытаюсь явно связать с DLL. Других ресурсов нет, кроме самого DLL-файла и некоторой документации о классах и его функциях-членах.Явная загрузка DLL

Из документации, каждый класс имеет свой собственный

  1. член ЬурейеЕ
    пример: typedef std::map<std::string,std::string> Server::KeyValueMap, typedef std::vector<std::string> Server::String Array
  2. член перечисления
    пример: enum Server::Role {NONE,HIGH,LOW}
  3. функция член
    пример: 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

я немного запутался ... (хорошо, хорошо ... очень смущен)

  1. ли я называть (GetProcAddress) каждую функцию общественного члена в отдельности, только когда хотите их использовать?
  2. Я создаю фиктивный класс, который имитирует класс в dll. Затем внутри определения класса я вызываю эквивалентную функцию из DLL? (Я здесь смысл?) Fnieto, это то, что вы показываете мне в конце вашего сообщения?
  3. Возможно ли создать экземпляр всего класса из DLL?

Я пытался использовать функцию подключения, описанную в моем первом сообщении. С выхода Depends.exe DLL,

  • станд :: Карта // KeyValueMap имеет следующие функции-члены: дель, пустой, получить, has_1key установите
  • станд :: вектор // StringArray имеет следующие функции-членов: надстройки, емкость, ясно, получить, IsEmpty, резерв, набор, размер

, которая отличается от функций членов карты и вектора в моей компиляции r (VS 2005) ...

Любая идея? или я получаю неправильную картину здесь ...

ответ

3

Если вы не используете дизассемблер и не пытаетесь выяснить тип paramater из готового кода, вы не сможете. Такая информация не хранится в DLL, а в файле заголовка, поставляемом с DLL. Если у вас его нет, DLL не будет использоваться вами.

0

Я был бы очень осторожен, если бы я был вами: библиотека STL не была предназначена для использования в таких границах компиляции.

Не то, чтобы этого нельзя было сделать, но вам нужно знать, к чему вы клоните.

Это означает, что использование классов STL через границы DLL может безопасно работать, только если вы скомпилируете свой EXE с тем же самым точным компилятором и версией и теми же настройками (особенно DEBUG или RELEASE) в качестве исходной DLL. И я имею в виду «точный» матч.

Стандартная STL-библиотека C++ - это спецификация поведения, а не реализация. Различные компиляторы и даже разные версии одного и того же компилятора могут и будут отличаться от реализации кода и данных. Когда ваша библиотека возвращает вам std::map, она возвращает вам биты, которые работают с версией библиотеки STL, а не кодом STL, скомпилированным в вашем EXE.

(и я даже не касаясь того, что имя коверкание может также отличаться от компилятора к компилятору)

Без получения более подробной информации о ваших обстоятельствах, я не могу быть уверен; но это может быть банда червей.

+0

благодарит за ваш ответ ... Какие еще детали вам нужны? .. Я не уверен, что я подробно должен буду искать. – justin

+0

Ну, в сущности, откуда взялась DLL. Я был бы очень обеспокоен, если бы вы сказали, что это была DLL, переданная вам, и вы не знали, откуда она взялась, или какой компилятор был использован. Я был бы гораздо менее обеспокоен, если бы он был разработан кем-то другим в вашей организации, и вы точно знали, какой компилятор они используют, и вы могли бы скоординировать свои обновления компилятора с другим человеком. Так же, как @fnieto, я не заметил соединение Java Native Interface; У меня нет опыта работы с JNI. –

0

Для того, чтобы связать с DLL, вам необходимо:

  1. библиотека импорта (.LIB файл), это описывает связь между именами C/C++ и экспорта DLL.
  2. Подписи C/C++ экспортируемых элементов (обычно это функции), описывающие соглашение о вызове, аргументы и возвращаемое значение. Обычно это происходит в файле заголовка (.H).

С вашего вопроса, похоже, вы можете угадать сигнатуры (# 2), но вам действительно нужен файл LIB (# 1).

Компонент может помочь вам сгенерировать LIB из библиотеки DLL с использованием промежуточного DEF. Для получения более подробной информации обратитесь к этому вопросу: How to generate an import library from a DLL?

Затем вам необходимо передать .lib в качестве «дополнительной библиотеки» в компоновщик. DLL должна быть доступна в PATH или в целевой папке.

Смежные вопросы