Delphi中DLL / Exe中的字符串处理

时间:2019-03-17 00:19:23

标签: delphi dll

我继承了一个由EXE和DLL组成的应用程序,它们都使用ShareMem作为第一个单元。该应用程序希望传递一个字符串(字符串类型,而不是PChar / PWideChar)

应用程序具有一个定义“字符串”变量的单元,该变量包含在EXE和DLL中。期望DLL将设置变量(基于传递给DLL的某些数据),然后再使用它...

我试图提供一个最小的完整示例应用程序,以演示下面的行为...

在共享单元中定义的变量

List lst = ....
Collections.sort(lst,
(a, b) -> ((String) ((List) a.get(0))).getSomeProp().compareTo(((String) ((List) a.get(0)))));

exe ... dpr ...     程序ExeProject;

unit SharedValues;

interface

var
  SomeVariable: string;

implementation

end.

主要形式...

uses
  ShareMem,
  Vcl.Forms,
  Main in 'src\Main.pas' {Form1},
  SharedValues in '..\Shared\SharedValues.pas';

DLL

procedure TForm1.Button1Click(Sender: TObject);
const
  lLibraryName = 'DllProject.dll';
var
  lDllHandle: THandle;
  lLength: Integer;

  lCreatorFunc: function: Integer; stdcall;
begin
  SharedValues.SomeVariable := 'Shared variable set in EXE';

  lDllHandle := LoadLibrary(PChar(lLibraryName));
  if (lDllHandle <> 0) then
  begin
    lCreatorFunc := GetProcAddress(lDllHandle, 'LoadDll');
    if Assigned(lCreatorFunc) then
    begin
      OutputDebugString(PChar(Format('In Exe (before dll): Shared Variable: %s (%d) 0x%p', [SharedValues.SomeVariable, Length(SharedValues.SomeVariable), @SharedValues.SomeVariable])));

      lLength := lCreatorFunc;

      OutputDebugString(PChar(Format('Length returned from DLL: %d', [lLength])));

      OutputDebugString(PChar(Format('In Exe (after dll): Shared Variable: %s (%d) 0x%p', [SharedValues.SomeVariable, Length(SharedValues.SomeVariable), @SharedValues.SomeVariable])));
    end;
  end else begin
    ShowMessage(SysErrorMessage(GetLastError));
  end;
end;

以上内容的输出...

library DllProject;

uses
  ShareMem,
  System.SysUtils,
  System.Classes,
  WinApi.Windows,
  SharedValues in '..\Shared\SharedValues.pas';

{$R *.res}

function LoadDll: Integer; stdcall;
begin
  OutputDebugString(PChar('DLL Before: ' + SharedValues.SomeVariable));

  SharedValues.SomeVariable := 'short';

  OutputDebugString(PChar('DLL After: ' + SharedValues.SomeVariable));

  Result := Length(SharedValues.SomeVariable);
end;

exports
  LoadDll;

begin
end.

那么这是怎么回事?当我调试并查看变量的内存位置(使用Addr和/或“ @”)时,看起来该变量在exe和dll中是相同的地址,但是我想我已经得到了该变量的副本在EXE中和DLL中的一个副本...但是,在调试器下,我在设置“ SharedValues.SomeVariable”后看到该变量未更改(即,似乎是exe中的值,而不是DLL中设置的值)

enter image description here

有人可以在这里稍微疏远一下/将我指向正确的方向吗?

0 个答案:

没有答案