Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

AnsiString и чужая библиотека в dll

12K
22 ноября 2006 года
needjava
30 / / 06.10.2006
Здравствуйте. Есть проблема. Создаю dll с помощью dll wizard.
В него добавляю свои функции и чужую библиотеку
Код:
#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;
}
...
...
// дальше идут тела функций
...


В функции 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;
}

Компилится нормально, а при запуске вываливается Access Violation на строчке
 
Код:
(cForm)();


Что я неправильно делаю?! Пробовал заменить AnsiString на ShortString - не помогло...:(
Пробовал создать Console Application, в него добавить все функции, которые я в dll добавляю и в main'е вызывать formKey(); - работает нормально, как и ддолжно - без ошибок. Подскажите, может кто уже сталкивался с подобной проблемой.
547
23 ноября 2006 года
Hydra
488 / / 20.06.2006
cFrom точно не NULL?
12K
23 ноября 2006 года
needjava
30 / / 06.10.2006
Сообщаю:
Выполнил в командной строке
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 сделать задать имена функций, чтобы потом их можно было дергать с таким же названием
12K
23 ноября 2006 года
needjava
30 / / 06.10.2006
c AnsiString - не выходит - ругается - компилится нормально а в рантайме вылетает AccessViolation
функцию написал такую:

typedef void (WINAPI *RS_testStr)(AnsiString, AnsiString);

вызываю так

RS_testStr cTestStr;
cTestStr = (RS_testStr)GetProcAddress(hMyDll,"_testStr");
(cTestStr)("test1", "test2");

В отладке смотрю - cTestStr = NULL.
Как сделать, чтобы работало не знаю, сейчас просто заменил на char* как борланд советует.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог