Ash*_*kan 2 delphi dll pascal freepascal
我是pascal的新手.我想在免费pascal中调用.dll文件中的函数,并在运行项目时出现以下错误:
无法在动态链接库HNLib.dll中找到过程入口点GetProcAddress.
这是代码:
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.
Run Code Online (Sandbox Code Playgroud)
.pas文件和DLL位于一个目录中.
请帮我!
GetProcAddress不是你认为的那样; 它的目的是在DLL中定位命名过程或函数并返回该函数的地址,以便可以从代码中调用它.您必须首先使用LoadLibrary将动态链接库(DLL)加载到内存中,然后将句柄作为第一个参数传递给该DLL,GetProcAddress并将其所需地址的函数名称作为第二个参数.如果可以在DLL中找到该函数,则返回它的地址,并且可以使用该地址来调用该函数.
(另外,GetProcAddress是相当Windows专用,并在WinAPI的大部分功能stdcall,而不是cdecl,除非你有文件说,函数使用cdecl调用约定,你应该使用stdcall.)
您还需要至少Windows在你使用条款单位,因为这是在那里GetProcAddress和LoadLibrary声明.
有关更多信息,请参阅LoadLibrary和GetProcAddress上的WinAPI文档.
对于初学程序员,您可能会发现使用函数的静态链接而不是动态(您可以使用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.
Run Code Online (Sandbox Code Playgroud)
请注意,当静态链接这样的DLL函数时,您的DLL必须在应用程序启动时可用,并且该函数必须包含在该DLL中; 如果没有,您的应用程序将无法加载.
另外,请注意,在DLL中通常不能具有多个具有相同名称的函数,因为没有可用于确定在加载完成时加载哪个函数的信息.每个都应该有一个单独的,不同的名称,否则加载可能会失败.
| 归档时间: |
|
| 查看次数: |
1901 次 |
| 最近记录: |