Recent

Author Topic: Не работает GetProcAddress  (Read 3216 times)

spayn

  • Newbie
  • Posts: 3
Не работает GetProcAddress
« on: July 28, 2021, 04:00:24 pm »
Добрый день! После обновления на новую версию FPС 3.2.0 перестал работать GetProcAddress(hInstance, 'ExtAddToLog') - запускаю из DLL для обращения к EXE за нужной функцией, выдает пустое значение. На fpc 3.0.2 работало успешно. Подскажите как решить данную проблему в новой версии?
« Last Edit: July 28, 2021, 04:09:01 pm by spayn »

skalogryz

  • Global Moderator
  • Hero Member
  • *****
  • Posts: 2668
    • havefunsoft.com
Re: Не работает GetProcAddress
« Reply #1 on: July 28, 2021, 08:44:47 pm »
что за .dll?  - сам ли .dll компилируешь, али уже существует она?
на какой CPU оринетируешься, да совпадает ли архитексутра с архитектурой dll?
а значение hInstance какое?
а что GetLastError() возвращает? (после вызова GetProcAddress())

spayn

  • Newbie
  • Posts: 3
Re: Не работает GetProcAddress
« Reply #2 on: July 29, 2021, 07:17:02 am »
Все компилирую в одной среде разработки, dll в том числе. DLL отдельная сущность подключаемая к ядру, чтобы выполнять определенные действия при условии. Архитектура единая на 64 битной все делаю. hInstance выдает MZ. Сам GetProcAddress() не выдает ошибок при выполнении команды, выдает пустоту. Ранее выдавал поинтер на предыдущих версиях.

Seenkao

  • Full Member
  • ***
  • Posts: 215
Re: Не работает GetProcAddress
« Reply #3 on: July 29, 2021, 06:34:55 pm »
Вам задали вопрос, какую DLL вы используете. (имя файла напишите).
Вообще, такие вещи лучше скидывать вместе с программой. Вероятно, при переустановке FPC удалились либо пути, либо сам файл (но это не обязательно), потому проверьте, существует ли данный файл и проверьте пути до него.
Можете попробовать прописать пути до этого файла вручную.

skalogryz

  • Global Moderator
  • Hero Member
  • *****
  • Posts: 2668
    • havefunsoft.com
Re: Не работает GetProcAddress
« Reply #4 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-ки
« Last Edit: July 29, 2021, 07:40:49 pm by skalogryz »

spayn

  • Newbie
  • Posts: 3
Re: Не работает GetProcAddress
« Reply #5 on: August 04, 2021, 09:31:08 am »
Спасибо за помощь. Решение нашлось в лоб, может костыльно, но работает) Передаю в DLL poinet напрямую из EXE без динамики

 

TinyPortal © 2005-2018