Форум — Ответы     (  К темам )
 ?  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)
с переходом согасен...