Delphi 如何正确地动态调用DLL
我试图学习本教程,但它总是抛出访问冲突错误druingFreeLibary。我哪里出错了?这是我的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
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作为参数传递。好了,现在您知道了问题的来源,不需要花很长时间就可以确定问题的来源。我会说“祝你好运”,但你不需要运气,只需要耐心和决心。为什么不只构建一个单片可执行文件呢?