link144 link145 link146 link147 link148 link149 link150 link151 link152 link153 link154 link155 link156 link157 link158 link159 link160 link161 link162 link163 link164 link165 link166 link167 link168 link169 link170 link171 link172 link173 link174 link175 link176 link177 link178 link179 link180 link181 link182 link183 link184 link185 link186 link187 link188 link189 link190 link191 link192 link193 link194 link195 link196 link197 link198 link199 link200 link201 link202 link203 link204 link205 link206 link207 link208 link209 link210 link211 link212 link213 link214 link215 link216 link217 link218 link219 link220 link221 link222 link223 link224 link225 link226 link227 link228 link229 link230 link231 link232 link233 link234 link235 link236 link237 link238 link239 link240 link241 link242 link243 link244 link245 link246 link247 link248 link249 link250 link251 link252 link253 link254 link255 link256 link257 link258 link259 link260 link261 link262 link263 link264 link265 link266 link267 link268 link269 link270 link271 link272 link273 link274 link275 link276 link277 link278 link279 link280 link281 link282 link283 link284 link285 link286 link287

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