Delphi 如何正确地动态调用DLL

Delphi 如何正确地动态调用DLL,delphi,Delphi,我试图学习本教程,但它总是抛出访问冲突错误druingFreeLibary。我哪里出错了?这是我的DLL代码: library EditDocument; uses System.SysUtils, Vcl.Dialogs, System.Classes, dxmdaset; {$R *.res} procedure EditDocument2(const fieldName : string); stdcall; begin ShowMessage(fieldNa

我试图学习本教程,但它总是抛出访问冲突错误druingFreeLibary。我哪里出错了?这是我的DLL代码:

library EditDocument;

uses
  System.SysUtils,
  Vcl.Dialogs,
  System.Classes,
  dxmdaset;

{$R *.res}



procedure EditDocument2(const fieldName : string); stdcall;
begin
  ShowMessage(fieldName);
end;


exports EditDocument2;

begin
end.
这就是我在我的主程序中所说的:

procedure TfrmMain.btn1Click(Sender: TObject);
type
  TDLL_EditDocument = procedure (const fieldName : string); stdcall;

var
  dllHandle : THandle;
  aFunction : TDLL_EditDocument;
begin

  dllHandle := LoadLibrary('EditDocument.dll') ;

  if dllHandle = 0 then
  begin
    CommonHelper.MsgDlgError('DLL not found EditDocument.dll');
    Exit;
  end;

  @aFunction := GetProcAddress(dllHandle, 'EditDocument2') ;
  if Assigned (aFunction) then
  begin
    aFunction('test');
  end;

  FreeLibrary(dllHandle);


end;
另外,我在我的主项目中使用了Sharemem,它是uses子句中的第一个单元。我尝试过将stdcall改为cdecl,将参数改为shortstring,甚至删除了所有参数,但在FreeLibrary期间总是抛出错误。我相信这很容易,但已经花了我两个小时。 我使用的是DelphiXe7。
提前感谢当您使用
Sharemem
时,它必须是主项目和库中的第一个单元


当您删除所有不应该成为问题的参数时(另请参见),但在尝试此操作时可能没有编译这两个项目。当您点击compile/run甚至build时,将只编译当前项目。确保在处理过程签名时运行Project->Build All。

使用
Sharemem
时,它必须是主项目和库中的第一个单元


当您删除所有不应该成为问题的参数时(另请参见),但在尝试此操作时可能没有编译这两个项目。当您点击compile/run甚至build时,将只编译当前项目。确保在处理过程签名时运行Project->Build All。

如果要使用
Sharemem
,则还需要在DLL项目中使用它。DLL项目的use子句中缺少它

除此之外,您的错误最有可能是您使用的某个单元的最终代码。鉴于已知RTL和VCL单元能够处理动态加载和卸载,这就指向了
dxmdaset
。尝试从DLL中删除该单元


最后,有时外部DLL会引发在调试器中触发的第一次机会异常,但实际上不会导致任何问题。您是否已100%确保对
freebrary
的调用实际上不会成功返回。您可以通过捕获并输出
freebrary

的返回值来实现这一点。如果要使用
Sharemem
,您还需要在DLL项目中使用它。DLL项目的use子句中缺少它

除此之外,您的错误最有可能是您使用的某个单元的最终代码。鉴于已知RTL和VCL单元能够处理动态加载和卸载,这就指向了
dxmdaset
。尝试从DLL中删除该单元


最后,有时外部DLL会引发在调试器中触发的第一次机会异常,但实际上不会导致任何问题。您是否已100%确保对
freebrary
的调用实际上不会成功返回。您可以通过捕获并输出
freebrary

的返回值来实现这一点,并将ShareMem放入EXE和DLL中。然后删除sharemem和参数,仍然会出错。。不知道是什么happening@Ago:您已经发现问题出在单元dxmdaset上。只需调试它并找出哪里出了问题。将ShareMem同时放入EXE和DLL仍然是错误的。然后删除sharemem和参数,仍然会出错。。不知道是什么happening@Ago:您已经发现问题出在单元dxmdaset上。只需调试它并找出哪里出了问题。您的
dxmdaset
单元中是否有
初始化
终结
代码,或者它使用的任何您自己的单元中是否有?没有。。我删除了所有内容..我删除了uses子句中的dxmdaset,现在一切正常。。这是不好的,因为我的主要目标是将TdxMemData作为参数传递。好了,现在您知道了问题的来源,不需要花很长时间就可以确定问题的来源。我会说“祝你好运”,但你不需要运气,只需要耐心和决心。为什么不只构建一个单一的单片可执行文件呢?在你的
dxmdaset
单元中有
初始化
终结
代码,或者它使用的任何你自己的单元中都没有。。我删除了所有内容..我删除了uses子句中的dxmdaset,现在一切正常。。这是不好的,因为我的主要目标是将TdxMemData作为参数传递。好了,现在您知道了问题的来源,不需要花很长时间就可以确定问题的来源。我会说“祝你好运”,但你不需要运气,只需要耐心和决心。为什么不只构建一个单片可执行文件呢?