我的应用程序必须具有从外部DLL调用不同功能和过程的能力。因此,我们不知道参数的数量及其类型。我应该怎么做?

让我进一步解释。我的应用程序是RAD工具,它具有自己的脚本和语法...我想让用户使用任何dll文件并调用他们想要的任何函数或过程。我无法使用调用dll的简单方法(先先先LoadLibraryGetProcAddress),因为我不知道GetProcAddress指的是哪种类型(var Proc:procedure (A:??;B:??;...))。

最佳答案

这是一个可以在我的机器上运行的简单示例,但是我不是该主题的专家。

procedure TForm4.Button1Click(Sender: TObject);
var
  hmod: HMODULE;
  paddr: pointer;
  c1, c2, ret: cardinal;
begin
  c1 := 400; //frequency
  c2 := 2000; // duration

  hmod := LoadLibrary('kernel32'); // Of course, the name of the DLL is taken from the script
  if hmod <> 0 then
    try
      paddr := GetProcAddress(hmod, 'Beep'); // ...as is the name of the exported function
      if paddr <> nil then
      begin
        // The script is told that this function requires two cardinals as
        // arguments. Let's call them c1 and c2. We will assume stdcall
        // calling convention. We will assume a 32-bit return value; this
        // we will store in ret.
        asm
          push c2
          push c1
          call [paddr]
          mov ret, eax
        end;
      end;
    finally
      FreeLibrary(hmod);
    end;
end;

10-08 04:09