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