我继承了一个由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中设置的值)
有人可以在这里稍微疏远一下/将我指向正确的方向吗?