我在 Delphi 11 中开发了一个 DLL 文件,并希望在 Delphi 7 应用程序中使用它。但是,我遇到了一些问题。
在Delphi 11中创建主机应用程序时,我可以使用以下代码来使用我的DLL函数:
type
TMergeText = function(t1, t2: String): String; stdcall;
procedure TForm1.btnMergeClick(Sender: TObject);
var
handle: THandle;
MergeText: TMergeText;
LNewText: String;
begin
handle := LoadLibrary(PChar(dll_path));
if handle <> 0 then
begin
@MergeText := GetProcAddress(handle, 'MergeText');
if @MergeText <> nil then
begin
LNewText := MergeText(edText1.Text, edText2.Text);
edMerged.Text := LNewText;
end;
FreeLibrary(handle);
end;
end;
当我在 Delphi 7 应用程序中使用此代码时,执行命令时遇到以下错误消息
FreeLibrary(handle)
:
Project HostProgramDLL.exe raised exception class EInvalidPointer with message 'Invalid pointer operation'.
我的Delphi 11和Delphi 7项目都配备了ShareMem,DLL项目也包含了ShareMem。
当我使用另一个函数时,只需将一些整数相加,一切似乎都工作正常。因此,我假设使用字符串值作为函数参数和结果时会出现问题,但我不确定。
您能帮我找出此问题的根本原因并提出解决方案吗?
Delphi 7
String
类型是 AnsiString
,而较新的 Delphi 版本(从 D2009 开始)使用String=UnicodeString
,因此您尝试在 EXE 和 DLL 之间移动不同的类型。
此外,D7 和现代版本中的
AnsiString
a) 具有不同的内在结构 b) 使用不同的内存管理器进行管理,因此 Sharemem
并不能解决所有可能的内存管理问题。
明智的做法是在两端提供相同的简单(非托管)类型 -
PWideChar
或 PAnsiChar
。
还值得一提的是
Widestring
类型,它实现了用于COM交互的系统BSTR
,并由操作系统管理。