1

我的问题不是导出函数,而是导入它。我确信函数和 DLL 都可以工作,因为我使用了硬编码路径来指向 DLL。

这是目前的工作:

function RoamingAppDataPath: String; external 'C:\Users\Peter\AppData\Roaming\ss\Application\ss.dll';

但是我需要用动态值指向 DLL,所以我试图做的是

  1. 声明一个全局变量(DLLPath: String)
  2. 为 DLLPath 分配值 - RoamingAppDataPath+'\ss\Application\ss.dll'

注意: RoamingAppDataPath 是一个输出漫游应用数据文件夹路径的函数。

我试图运行的代码是:

function RoamingAppDataPath: String; external DLLPath;

当我编译代码时,Delphi 告诉我它需要一个常量表达式:

E2026 Constant expression expected

解决这个问题的方法是什么?

4

2 回答 2

4

您必须在运行时绑定,这意味着您需要使用 LoadLibrary 和 GetProcAddress:

var
  lib: HMODULE;
  RoamingAppDataPath: function: string;

lib := LoadLibrary(dllfilename);
if lib=0 then 
  RaiseLastOSError;
Pointer(RoamingAppDataPath) := GetProcAddress(lib, 'RoamingAppDataPath');

然后你可以调用它:

radp := RoamingAppDataPath;

一些评论:

  • 当它存在于标准系统库中时,我不知道为什么要编写此函数。
  • 跨 DLL 边界使用字符串可能会失败。您需要使用 ShareMem 并确保所有代码都使用相同的 Delphi 版本构建。最好在调用代码中分配缓冲区。
于 2013-03-10T13:30:01.023 回答
2

即使可以使用变量,也无法为 DLLPATH 设置值,因为如果不能使用静态 DLL,则不会使用初始化。如果要定义 DLL 的路径,则必须使用动态加载。

  procedure Test;external 'Notexists.DLL';
var
  Form2: TForm2;

implementation

{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
begin
  test;
end;

initialization
Showmessage('Hallo'); // will never be seen if test is used.
于 2013-03-10T12:40:35.320 回答