Здравствуйте, 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. из длл по полученному указателю вызываются функции программы.
Такая схема удобна тем что нет необходимости динамически определять адреса функций в длл, достаточно определить интерфейс (в широком смысле слова) и передать один указатель.
Если надо вызывать функцию третьей программы, ее предварительно надо подгрузить.