#include <vcl.h>
#include <windows.h>
#include "LbAsym.hpp" // - это чужая библиотека
...
...
...
AnsiString generateNumb(int size); // - мои функции
extern "C" __declspec(dllexport)void formKey(); // - мои функции
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
srand(time(NULL));
return 1;
}
...
...
// дальше идут тела функций
...
AnsiString и чужая библиотека в dll
В него добавляю свои функции и чужую библиотеку
Код:
В функции formKey - используется для инициализации объекта оператор new и потом деструктор для объекта.
В свойствах проэкта галка Linker->Use dynamic RTL - убрана,
галка Packages->Bild with runtime packages - не убрана (если ее убрать -
вываливаются ошибки [Linker Error] Unresolved external '__fastcall MyObjectC::~MyObjectC()' referenced from C:\DLLUNIT.OBJ)
Таким образом галка Bild with runtime packages - не убрана.
Этот cpp-файл я build'ю и затем из командной строки пишу
implib dllprj.lib dllprj.dll
Получившуюся dllprj.dll я теперь хочу протестить. Для этого создаю новый проэкт - Console Application, код которого следующий:
Код:
#include <windows.h>
#include <vcl.h>
#pragma hdrstop
#pragma argsused
typedef void (WINAPI *CI_formKey)(void );
int main(int argc, char* argv[])
{
HINSTANCE hMyDll;
if((hMyDll=LoadLibrary("dllPrj"))==NULL) return 1;
CI_formKey cForm;
cForm = (CI_formKey)GetProcAddress(hMyDll,"formKey");
(cForm)();
FreeLibrary(hMyDll);
return 0;
}
#include <vcl.h>
#pragma hdrstop
#pragma argsused
typedef void (WINAPI *CI_formKey)(void );
int main(int argc, char* argv[])
{
HINSTANCE hMyDll;
if((hMyDll=LoadLibrary("dllPrj"))==NULL) return 1;
CI_formKey cForm;
cForm = (CI_formKey)GetProcAddress(hMyDll,"formKey");
(cForm)();
FreeLibrary(hMyDll);
return 0;
}
Компилится нормально, а при запуске вываливается Access Violation на строчке
Код:
(cForm)();
Что я неправильно делаю?! Пробовал заменить AnsiString на ShortString - не помогло...:(
Пробовал создать Console Application, в него добавить все функции, которые я в dll добавляю и в main'е вызывать formKey(); - работает нормально, как и ддолжно - без ошибок. Подскажите, может кто уже сталкивался с подобной проблемой.
cFrom точно не NULL?
Выполнил в командной строке
tdump dllPrj.dll > dump.txt
В файле dump.txt нашел строки:
RVA Ord. Hint Name
-------- ---- ---- ----
00001640 1 0005 _formKey
В проге - заменил
cForm = (RS_formKey)GetProcAddress(hMyDll,"formKey");
на
cForm = (RS_formKey)GetProcAddress(hMyDll,"_formKey");
Заработало!!!:)
Сейчас еще
1. протестю с AnsiString'ом
2. Вопрос остается открытым - как при создании dll сделать задать имена функций, чтобы потом их можно было дергать с таким же названием
функцию написал такую:
typedef void (WINAPI *RS_testStr)(AnsiString, AnsiString);
вызываю так
RS_testStr cTestStr;
cTestStr = (RS_testStr)GetProcAddress(hMyDll,"_testStr");
(cTestStr)("test1", "test2");
В отладке смотрю - cTestStr = NULL.
Как сделать, чтобы работало не знаю, сейчас просто заменил на char* как борланд советует.