Бесплатный Паскаль не может найти точку входа для DLL - PullRequest
2 голосов
/ 22 февраля 2012

Я новичок в паскале.Я хочу вызвать мою функцию в файле .dll бесплатно на Паскале, и при запуске проекта я получаю следующую ошибку:

Не удалось найти точку входа в процедуру GetProcAddress в библиотеке динамических ссылок HNLib.dll.

вот код:

Program Test;
function GetProcAddress : Integer; cdecl; external 'HNLib.dll';
function GetProcAddress : Single; cdecl; external 'HNLib.dll';
procedure GetProcAddress( X : Single); cdecl; external 'HNLib.dll';
procedure GetProcAddress; cdecl; external 'HNLib.dll';
begin
  GetProcAddress( 5.5 );
  readln;
end.

.pas файл и dll находятся в одном каталоге.

Пожалуйста, помогите мне!

1 Ответ

7 голосов
/ 23 февраля 2012

GetProcAddress - это не то, что вам кажется; его цель - найти именованные процедуры или функции в DLL и вернуть адрес этой функции, чтобы ее можно было вызывать из вашего кода. Сначала необходимо использовать LoadLibrary для загрузки библиотеки динамической компоновки (DLL) в память, а затем передать дескриптор этой DLL в качестве первого параметра GetProcAddress и имя функции, адрес которой вы хотите использовать в качестве второго параметра. , Если функцию можно найти в библиотеке DLL, возвращается ее адрес, и вы можете использовать этот адрес для вызова функции.

(Кроме того, GetProcAddress довольно специфичен для Windows, и большинство функций в WinAPI stdcall, а не cdecl. Если у вас нет документации о том, что функции используют соглашение о вызовах cdecl , вы, вероятно, должны использовать stdcall.)

Вам также понадобится хотя бы единица Windows в предложении использования, поскольку именно здесь объявлены GetProcAddress и LoadLibrary.

См. Документацию WinAPI по LoadLibrary и GetProcAddress для получения дополнительной информации.

Для начинающего программиста вам, вероятно, будет проще использовать статическое связывание функций вместо динамического (которое вы получаете с GetProcAddress). Пример статического связывания будет (непроверенный !!! - просто быстрый пример кода, так как у меня нет 'HNLib.DLL' для ссылки):

// Your Dll import unit
unit MyDllProcs;

interface

  function GetIntCalcResult(const IntVal: Integer); 

implementation

  function GetIntCalcResult(const IntVal: Integer); stdcall; external 'HNLib.dll';

end.

// Your own app's code
program Test;

interface

  uses MyDllProcs;

implementation

function DoSomethingWithDll(const ValueToCalc: Integer): Integer;        
begin
  Result := GetIntCalcResult(ValueToCalc);
end;

begin
  WriteLn('DoSomethingWithDll returned ', DoSomethingWithDll(10));
  ReadLn;
end.

Обратите внимание, что при статическом связывании функций DLL, подобных этой, ваша DLL должна быть доступна при запуске приложения, и эта функция должна содержаться в этой DLL; в противном случае ваше приложение не будет загружено.

Кроме того, обратите внимание, что в DLL обычно не может быть несколько функций с одним и тем же именем, поскольку нет информации, которую можно было бы использовать, чтобы определить, какую из них загрузить, когда выполняется загрузка. У каждого должно быть свое отдельное имя, иначе загрузка может завершиться неудачей.

...