目標:dll給結構體賦值以后,sendmessage發送給exe程式,
bug: exe可以獲取結構體內的int型別的值,但是字串類的不對,不能訪問,或者是亂碼
代碼如下
procedure TfrmUI.SendCopydata(Aindex:Integer);
var
cdds: TCopyDataStruct;
begin
cdds.dwData := SizeOf(cdds);
cdds.cbData := SizeOf(TGMClient)+1;
cdds.lpData := @FClientList[Aindex];
SendMessage(FClientList[AIndex].handleC, WM_COPYDATA, 0, Cardinal(@cdds));
uj5u.com熱心網友回復:
var
cdds: TCopyDataStruct;
FClientList:AnsiString;
begin
FClientList:= '亂馬1/2';
cdds.dwData := SizeOf(cdds);
cdds.cbData := SizeOf(TGMClient)+1;
cdds.lpData := PAnsiChar(FClientList);
....
uj5u.com熱心網友回復:
我傳動的引數是一個結構體TGMClient = record結構體內的字串亂碼有時候是無效資料
index: Integer; //編號
account:string; //賬號
pwd:string; //密碼
handleS: Cardinal; //主控端的視窗句柄
handleC: Cardinal; //DLL視窗句柄
Line: Cardinal; //線路
RoleName: ShortString; //角色名
MapName: ShortString; //地圖名 或者可以用地圖ID
State: Cardinal; //狀態
ScriptC:String;//當前指令
end;
uj5u.com熱心網友回復:
如果要在不同行程間通信,一定不要使用string你這個結構體中把string全部替換成char陣列就可以了
TGMClient = record
index: Integer; //編號
account: array[0..255] of Char; //賬號
pwd: array[0..255] of Char; //密碼
handleS: Cardinal; //主控端的視窗句柄
handleC: Cardinal; //DLL視窗句柄
Line: Cardinal; //線路
RoleName: ShortString; //角色名
MapName: ShortString; //地圖名 或者可以用地圖ID
State: Cardinal; //狀態
ScriptC: array[0..255] of Char; //當前指令
end;
uj5u.com熱心網友回復:
// 目標行程
procedure OnWMCopyData(var Msg: TMessage); message WM_COPYDATA;
procedure TForm1.OnWMCopyData(var Msg: TMessage);
var
cdds: TCopyDataStruct;
pGmCl: PGMClient;
begin
cdds := PcopyDataStruct(Msg.LParam)^;
pGmCl := PGMClient(cdds.lpData);
mmo1.Clear;
with pGmCl^ do
begin
mmo1.Lines.Add(IntToStr(index));
mmo1.Lines.Add(account);
mmo1.Lines.Add(pwd);
mmo1.Lines.Add(IntToStr(handleS));
mmo1.Lines.Add(IntToStr(handleC));
mmo1.Lines.Add(IntToStr(Line));
mmo1.Lines.Add(RoleName);
mmo1.Lines.Add(MapName);
mmo1.Lines.Add(IntToStr(State));
mmo1.Lines.Add(ScriptC);
end;
end;
// 當前行程
procedure TForm1.btn1Click(Sender: TObject);
var
cdds: TCopyDataStruct;
pGmCl: PGMClient;
begin
GetMem(pGmCl, SizeOf(TGMClient));
with pGmCl^ do
begin
index := 222;
account := '帳號abc';
pwd := '密碼123';
handleS := 1222222;
handleC := 3343434;
Line := 99999;
RoleName := 'PK抽煙不掉灰';
MapName := '有張地圖';
State := 4;
ScriptC := 'shutdown....down....down....down...';
end;
cdds.dwData := SizeOf(cdds);
cdds.cbData := SizeOf(TGMClient);
cdds.lpData := pGmCl;
SendMessage(FindWindow(nil, '受'), WM_COPYDATA, 0, Cardinal(@cdds));
FreeMem(pGmCl);
end;
uj5u.com熱心網友回復:
字串不能傳指標,要復制一塊記憶體uj5u.com熱心網友回復:
或者在兩個工程中都參考ShareMem單元,以前是這么說的,新版delphi不知道是不是也需要這么干轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/120006.html
標籤:VCL組件開發及應用
上一篇:用spcomm接收串口資料問題
下一篇:新裝的XE2無法編譯
