powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / AnsiString и чужая библиотека в dll
13 сообщений из 13, страница 1 из 1
AnsiString и чужая библиотека в dll
    #34147455
needjava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте. Есть проблема. Создаю dll с помощью dll wizard.
В него добавляю свои функции и чужую библиотеку
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
#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, код которого следующий:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
#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 на строчке
Код: plaintext
1.
(cForm)();
Что я неправильно делаю?! Пробовал заменить AnsiString на ShortString - не помогло...
Пробовал создать Console Application, в него добавить все функции, которые я в dll добавляю и в main'е вызывать formKey(); - работает нормально, как и ддолжно - без ошибок. Подскажите, может кто уже сталкивался с подобной проблемой.
...
Рейтинг: 0 / 0
AnsiString и чужая библиотека в dll
    #34147533
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У вас соглашения о вызовах одинаковые ? Похоже
extern "C" __declspec(dllexport)void formKey();
не соответствует
typedef void (WINAPI *CI_formKey)(void );
...
Рейтинг: 0 / 0
AnsiString и чужая библиотека в dll
    #34147727
needjava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А как задать одинаковые соглашения?
...
Рейтинг: 0 / 0
AnsiString и чужая библиотека в dll
    #34147750
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если хочешь экспортировать функцию как formKey, пиши def-файл, по умолчанию она экспортируется как какое-нить _formKey@2
...
Рейтинг: 0 / 0
AnsiString и чужая библиотека в dll
    #34147759
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
if(cForm==NULL)айайай;
...
Рейтинг: 0 / 0
AnsiString и чужая библиотека в dll
    #34147782
needjava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А нельзя без def файла обойтись - мне нужно, чтобы был всего один файл - dll.
Как-то можно это в dll указать?
автор
по умолчанию она экспортируется как какое-нить _formKey@2

Как определить какое имя будет?
...
Рейтинг: 0 / 0
AnsiString и чужая библиотека в dll
    #34147821
needjava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сообщаю:
Выполнил в командной строке
tdump dllPrj.dll > dump.txt
В файле dump.txt нашел строки:

RVA Ord. Hint Name
-------- ---- ---- ----
00001640 1 0005 _formKey

В проге - заменил

Код: plaintext
1.
cForm = (RS_formKey)GetProcAddress(hMyDll,"formKey");

Код: plaintext
1.
cForm = (RS_formKey)GetProcAddress(hMyDll,"_formKey");

Заработало, мать ее ети!!!:)
...
Рейтинг: 0 / 0
AnsiString и чужая библиотека в dll
    #34147833
needjava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сейчас еще
1. протестю с AnsiString'ом
2. Вопрос остается открытым - как при создании dll сделать задать имена функций, чтобы потом их можно было дергать с таким же названием
...
Рейтинг: 0 / 0
AnsiString и чужая библиотека в dll
    #34148927
needjava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
c AnsiString - не выходит - ругается - компилится нормально а в рантайме вылетает AccessViolation
функцию написал такую:
Код: plaintext
1.
typedef void (WINAPI *RS_testStr)(AnsiString, AnsiString);
вызываю так
Код: plaintext
1.
2.
3.
RS_testStr cTestStr;
cTestStr = (RS_testStr)GetProcAddress(hMyDll,"_testStr");
(cTestStr)("test1", "test2");
В отладке смотрю - cTestStr = NULL.
Как сделать, чтобы работало не знаю, сейчас просто заменил на char* как борланд советует.
...
Рейтинг: 0 / 0
AnsiString и чужая библиотека в dll
    #34149653
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tdump
...
Рейтинг: 0 / 0
AnsiString и чужая библиотека в dll
    #34151171
needjava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
чего tdump?...
...
Рейтинг: 0 / 0
AnsiString и чужая библиотека в dll
    #34152634
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
смотри, под каким именем экспортируется функция. Плюс соглашения о вызове в длл и в приложении должны совпадать.
...
Рейтинг: 0 / 0
AnsiString и чужая библиотека в dll
    #34153154
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы AnsiString нормально передавать в dll и обратно, надо чтобы dll и приложение использовали общую rtl то есть везде должно быть включено "Use dynamic RTL"
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / AnsiString и чужая библиотека в dll
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]