我有一个用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;”,然后我收到访问冲突,访问字段时出错。
我该怎么办?谢谢!
在制作普通 DLL 时,不能跨 DLL 边界使用 Delphi RTL/VCL/FMX 对象。您需要创建一个包,并且需要让 EXE 和 BPL 项目都启用运行时包,以便它们共享 RTL/VCL/FMX 库的公共实例。