Lazarus

Other Languages => Russian => Topic started by: spayn on July 28, 2021, 04:00:24 pm

Title: Не работает GetProcAddress
Post by: spayn on July 28, 2021, 04:00:24 pm
Добрый день! После обновления на новую версию FPС 3.2.0 перестал работать GetProcAddress(hInstance, 'ExtAddToLog') - запускаю из DLL для обращения к EXE за нужной функцией, выдает пустое значение. На fpc 3.0.2 работало успешно. Подскажите как решить данную проблему в новой версии?
Title: Re: Не работает GetProcAddress
Post by: skalogryz on July 28, 2021, 08:44:47 pm
что за .dll?  - сам ли .dll компилируешь, али уже существует она?
на какой CPU оринетируешься, да совпадает ли архитексутра с архитектурой dll?
а значение hInstance какое?
а что GetLastError() возвращает? (после вызова GetProcAddress())
Title: Re: Не работает GetProcAddress
Post by: spayn on July 29, 2021, 07:17:02 am
Все компилирую в одной среде разработки, dll в том числе. DLL отдельная сущность подключаемая к ядру, чтобы выполнять определенные действия при условии. Архитектура единая на 64 битной все делаю. hInstance выдает MZ. Сам GetProcAddress() не выдает ошибок при выполнении команды, выдает пустоту. Ранее выдавал поинтер на предыдущих версиях.
Title: Re: Не работает GetProcAddress
Post by: Seenkao on July 29, 2021, 06:34:55 pm
Вам задали вопрос, какую DLL вы используете. (имя файла напишите).
Вообще, такие вещи лучше скидывать вместе с программой. Вероятно, при переустановке FPC удалились либо пути, либо сам файл (но это не обязательно), потому проверьте, существует ли данный файл и проверьте пути до него.
Можете попробовать прописать пути до этого файла вручную.
Title: Re: Не работает GetProcAddress
Post by: skalogryz on July 29, 2021, 07:15:55 pm
hInstance выдает MZ. Сам GetProcAddress() не выдает ошибок при выполнении команды, выдает пустоту. Ранее выдавал поинтер на предыдущих версиях.
hInstance не должен выдавать пустоту, вместое hInstance следует передавать handle бибилиотеки. LoadLibrary() где вызывается?

какой код выдаёт GetLastError()?


Вот пример поиграть:

hostapp.pas
Code: Pascal  [Select][+][-]
  1. program hostapp;
  2. {$mode objfpc}
  3. uses
  4.   Windows;
  5.  
  6. type
  7.   TNumFunc =  function : Integer;
  8.  
  9. var
  10.   h : THandle;  
  11.   p : Pointer;
  12. begin
  13.   writeln('fpc: ',{$i %FPCVERSION%},'; pointer size: ', sizeof(pointer));
  14.   h := LoadLibrary('plugin.dll');
  15.   if (h <> 0) and (h <> INVALID_HANDLE_VALUE) then
  16.   begin
  17.     p := GetProcAddress(h,'ExtAddToLog');
  18.     if p <> nil then
  19.       writeln('meaning of life: ',  TNumFunc(p)())
  20.     else
  21.       writeln('error: ', GetLastError);
  22.   end else
  23.     writeln('no plugin.dll');
  24. end.

plugin.pas
Code: Pascal  [Select][+][-]
  1. library plugin;
  2. {$mode objfpc}
  3.  
  4. function ExtAddToLog: Integer; cdecl;
  5. begin
  6.   Result:=42;
  7. end;
  8.  
  9. exports
  10.   ExtAddToLog;
  11.  
  12. end.

мой результат:
Code: Text  [Select][+][-]
  1. >hostapp.exe
  2. fpc: 3.2.0; pointer size: 8
  3. meaning of life: 42

Что доказывает: FPC 3.2 может загрузить функцию ExtAddToLog из 64-битной dll-ки
Title: Re: Не работает GetProcAddress
Post by: spayn on August 04, 2021, 09:31:08 am
Спасибо за помощь. Решение нашлось в лоб, может костыльно, но работает) Передаю в DLL poinet напрямую из EXE без динамики
TinyPortal © 2005-2018