Re: Экспортные функции у приложения
От: Leonidze  
Дата: 04.08.07 13:52
Оценка: 1 (1) +1
Здравствуйте, DDS, Вы писали:

DDS>Подскажите в чем беда, пытаюсб из библиотеки вызвать экспортную функцию подключенного приложения (естесственно тоже моего). Пишу так:


DDS>В DLL:

DDS>
DDS>...
DDS>var
DDS>    fD: function:pchar; stdcall;
DDS>begin
DDS>  fD:=GetProcAddress( GetWindowWord(hwn,GWW_HINSTANCE) ,'GetFromAPP');
DDS>  if @fD<>nil then fD else ShowMessage('shit!');
DDS>end;
DDS>...
DDS>

DDS>В проге так:
DDS>
DDS>...
DDS>function GetFromAPP(p:pchar):pchar; stdcall; export;
DDS>begin
DDS>  ShowMessage('cool!');
DDS>end;

DDS>exports
DDS>  GetFromAPP index 1 name 'GetFromAPP';  
DDS>end.
DDS>

DDS>Дак вот все время один SHIT)) Не находит он функцию. HWND правильный, в проге этот код располагаю в тексте проекта, но и в тексте модуля формы (че как раз HWND) тоже пробовал. Не помогает. Подскажите...

Традиционно хэндл приложения (hInstance) получается через GetModuleHandle(nil); эта функция возвращает хэндл работающего кода, т.е. для dll это будет хэндл длл, для программы — хэндл программы. Кроме того, переменная hInstance — ссылающаяся на собственный хэндл кода afaik инициализируется RTL при старте.

Не совсем понял задачу — надо из длл вызвать какое приложение? которое dll загрузило? в этом случае удобнее предусмотреть функцию в DLL которая будет хранить (опять-же, в длл) указатель на объект/интерфейс/функцию основной программы. Т.е. схема примерно такая:
1. грузим длл
2. вызываем функцию длл передавая ей как параметр адрес функции/объекта/интерфейса программы
3. из длл по полученному указателю вызываются функции программы.
Такая схема удобна тем что нет необходимости динамически определять адреса функций в длл, достаточно определить интерфейс (в широком смысле слова) и передать один указатель.

Если надо вызывать функцию третьей программы, ее предварительно надо подгрузить.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.