Delphi:Dll -> DataSet.First 导致访问冲突

问题描述 投票:0回答:1

我有一个用Delphi编写的简单Dll:

library usr_d;

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

{$R *.res}

Procedure SetMyData(DataSet: TDataSet);export;
begin
  if Assigned(DataSet) then
  begin
    ShowMessage(DataSet.FieldByName('MyFieldName1').AsString);
    try
      DataSet.First;
    except on E: Exception do
      ShowMessage('Error accessing field: ' + E.Message);
    end;
  end
  else
    ShowMessage('DataSet parameter is not assigned!');
end;

exports
  SetMyData;

begin
end.    

我这样称呼它:

Procedure TMainForm.CallMyDll;

type
  TSetMyData = procedure(DataSet: TDataSet); stdcall;

Var
  MyHandle               : HMODULE;
  SetMyData              : TSetMyData;  

Begin
  MyHandle := LoadLibrary('c:\MyFolder\usr_d.dll');
  if MyHandle <> 0 then
   begin
     @SetMyData := GetProcAddress(MyHandle, 'SetMyData');
     if @SetMyData <> nil then
      begin
        SetMyData(MyQuery as TDataSet);
      end;
     FreeLibrary(MyHandle);
   end;
End;

当我运行程序并调用Dll的过程时,“ShowMessage(DataSet.FieldByName('MyFieldName1').AsString);”工作正常,它显示字段值。我用几个不同的数据集尝试过。

但是如果我发出: “数据集。第一;”或“DataSet.Next;”,然后我收到访问冲突,访问字段时出错。

我该怎么办?谢谢!

delphi dll access-violation
1个回答
0
投票

在制作普通 DLL 时,不能跨 DLL 边界使用 Delphi RTL/VCL/FMX 对象。您需要创建一个包,并且需要让 EXE 和 BPL 项目都启用运行时包,以便它们共享 RTL/VCL/FMX 库的公共实例。

© www.soinside.com 2019 - 2024. All rights reserved.