link10650 link10651 link10652 link10653 link10654 link10655 link10656 link10657 link10658 link10659 link10660 link10661 link10662 link10663 link10664 link10665 link10666 link10667 link10668 link10669 link10670 link10671 link10672 link10673 link10674 link10675 link10676 link10677 link10678 link10679 link10680 link10681 link10682 link10683 link10684 link10685 link10686 link10687 link10688 link10689 link10690 link10691 link10692 link10693 link10694 link10695 link10696 link10697 link10698 link10699 link10700 link10701 link10702 link10703 link10704 link10705 link10706 link10707 link10708 link10709 link10710 link10711 link10712 link10713 link10714 link10715 link10716 link10717 link10718 link10719 link10720 link10721 link10722 link10723 link10724 link10725 link10726 link10727 link10728 link10729 link10730 link10731 link10732 link10733 link10734 link10735 link10736 link10737 link10738 link10739 link10740 link10741 link10742 link10743 link10744 link10745 link10746 link10747 link10748 link10749 link10750 link10751 link10752 link10753 link10754 link10755 link10756 link10757 link10758 link10759 link10760 link10761 link10762 link10763 link10764 link10765 link10766 link10767 link10768 link10769 link10770 link10771 link10772 link10773 link10774 link10775 link10776 link10777 link10778 link10779 link10780 link10781 link10782 link10783 link10784 link10785 link10786 link10787 link10788 link10789 link10790 link10791

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