在 Delphi 7 主机应用程序中使用 Delphi 11 中制作的 DLL 文件中的字符串函数会遇到“无效指针操作”错误

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

我在 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 dll
1个回答
2
投票

Delphi 7

String
类型是
AnsiString
,而较新的 Delphi 版本(从 D2009 开始)使用
String=UnicodeString
,因此您尝试在 EXE 和 DLL 之间移动不同的类型。

此外,D7 和现代版本中的

AnsiString
a) 具有不同的内在结构 b) 使用不同的内存管理器进行管理,因此
Sharemem
并不能解决所有可能的内存管理问题。

明智的做法是在两端提供相同的简单(非托管)类型 -

PWideChar
PAnsiChar

还值得一提的是

Widestring
类型,它实现了用于COM交互的系统
BSTR
,并由操作系统管理。

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