Форум — Ответы ( К темам )
? | andy: Как подгружать в свою dll ресурс чужой dll? И далее юзать только свою. (12-03-2003 13:17:10) |
Имеется dll функции и переменные, которой, известенны. Можно ли каким-то образом ресурсы этой dll использовать в своей dll. И в дальнейшем из приложения пользоваться функциями как своей, так и подгруженной (импортированной) библиотеки. Подскажите как это сделать. Спасибо. | |
Георгий (12-03-2003 17:15:00) | |
Конечно можно. динамическое линкование: при инициализации своей DLL грузишь другую DLL (LoadLibrary), получаешь адреса функций и переменных (GetProcAddres) эти адреса записываешь в локальные переменные соответствующего типа и используешь (хотя можно чужие переменные у себя как ссылочные (volatile не забудь написать) оформить — тогда даже забудешь, что это указатель...) при деинициализации DLL выгружаешь чужую DLL. статическое линкование — не пользуюсь, но мож кто ещё поможет | |
andy (13-03-2003 07:36:21) | |
Спасибо. Почти так и делал, но почемуто при вызове импортируемая функция не распознается.
| |
Георгий (13-03-2003 22:01:06) | |
проверил, то что я написал — всё распознаётся и работает Но обнаружил, что я сам и некоторые другие участники форума писали не корректный код использующий функции из DLL: экспортируемая функция обьявляется строкой вида: extern "C" int __export __stdcall Func(int); в переводе — экспортируется функция Func с такими-то параметрами, написанная на языке C и использующая т.н. соглашение STDCALL (если хотите могу и по подробнее) а при импорте её прототип обьявляется: int (*dllFunc)(int); т.е импортируется функция с такими-то параметрами, написанная на языке C и использующая т.н. соглашение C calling conversion а надо: int (__stdcall*dllFunc)(int); это несоответствия приводили к некорректной работе со стеком и последующими "спец. эффектами" в виде загадочной работы программы... для твоего вопроса привожу рабочий код: главная прога: void __fastcall TForm1::Button1Click(TObject *Sender) { HINSTANCE hDll; int (__stdcall*dllFunc)(int); hDll=LoadLibrary("2.dll"); if (hDll) { dllFunc =(int(__stdcall*)(int))GetProcAddress(hDll,"Func"); if (dllFunc) { this->Edit1->Text=dllFunc(2); }; FreeLibrary(hDll); }; } 2.dll : int __stdcall (*dllFunc)(int); static HINSTANCE hDll; extern "C" int __export __stdcall Func(int); int __stdcall Func(int a) { int z; z=dllFunc(a); return 1+z; }; #pragma argsused int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved) { switch (reason) { case DLL_PROCESS_ATTACH: hDll=LoadLibrary("1.dll"); dllFunc=(int __stdcall(*)(int))GetProcAddress(hDll,"dllFunc"); break; case DLL_PROCESS_DETACH: FreeLibrary(hDll); break; default:break; }; return 1; } 1.dll : extern "C" int __export __stdcall dllFunc(int); int __stdcall dllFunc(int a) { return a+2; }; | |
andy (25-03-2003 09:28:48) | |
Спасибо за подробный ответ. Я уже разобрался. Было три ошибки: 1. Как и в вашем ответе отсутствовало __stdcall в заголовочном файле (все объесления в заголовочном произвожу). Странно, в примере по созданию DLL этого нет. Для статической загрузки Dll __stdcall указывать не надо 2. В отличии от вашего примера потребовалось volatile. Без объевления этого типа загрузка функции не происходит. 3. Поскольку библиотека подгружается в ArcView (работа с электронными картами), то пришлось избавиться от переменных типа AnsiString. Оно их не понимает. | |
Георгий (25-03-2003 14:39:58) | |
Ё моё — знакомое название — ArcView — над нами у институте ставили опыты по само обучению (нашему) — сажали за ArcView и говорили, что надо разобраться в этой ГИС и написать какой-нибудь скрипт и препод уходил (наверное пить чай), а мы сидели и общались друг с другом (сапёр, червы и т.п.) если не секрет (вдруг ты у военных работаешь) расскажи, что для этой ГИС можно своими руками сделать — как я понял ты не скрипты писал... | |
andy (25-03-2003 16:56:42) | |
Угадал, у военных. Но секрета нет. Заканчиваю прикручивать GPS к этому делу. Дело осталось за наворотом кое-какого софта с сохранением пути следования и т.п. А это уже скриптами. Вот сижу и разбираюсь с этой бедой (ArcView). Ужасно не хотел этим заниматься, но вот пришлось. Смотрели в инете программульку, но менее чем за $1500 не попалось. | |
Георгий (25-03-2003 23:54:27) | |
Мне предлагали к военным пойти (тоже работать с ГИС), но сумму $$$ и обьём работ не оговаривали, мне это показалось подозрительным и я отказался... Кстати сколько платят, какой график работ и что требуют? | |
andy (26-03-2003 19:30:55) | |
Да, собственно, тут хвастаться нечем. Работаю не по договорам. Сотрудник буджетной организации. Со всеми ее плюсами и минусами. З/плата зависит от стажа (выслуги), звания и занимаемой должности. В общем искать дополнительный зароботок приходится. Предлагаю перейти на: andy001@mail.ru Вообще работаю в области программирования БД (у нас Oracle). Работа с ГИС — это так, просто интересной показалась задача. Вот и решил попробовать привернуть GPS-ку к ArcView. | |
Георгий (27-03-2003 08:49:28) | |
с переходом согасен...
|