Здравствуйте уважаемые граждане программисты.
Пишу приложение без VCL возникла необходимость посылки сообщений между приложениями при помощи WM_COPYDATA. В проесте с VCL всё работает замечательно а без VCL фигня какае-то. Причем в обработчике сообщений клиента сообщение WM_COPYDATA: принимается нормально а структура MsgV: TWMCopyData; остаётся пустой. Уже всю голову сломал.
Сервер , отсылаю так.
| Код | unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); var aCopyData: TCopyDataStruct; hTargetWnd: HWND; begin
//begin with aCopyData do begin dwData := 0; cbData := StrLen(PChar(Edit1.Text)) + 1; lpData := PChar(Edit1.Text) end; // Search window by the window title // Fenster anhand des Titelzeilentext suchen hTargetWnd := FindWindowEx(0, 0, nil, PChar({'WM_COPYDATA-Receiver'}'Клиент')); if hTargetWnd <> 0 then SendMessage(hTargetWnd, WM_COPYDATA, Longint(Handle), Longint(@aCopyData)) else ShowMessage('No Recipient found!');
end;
end.
|
Принимаю так :
| Код | program Client;
uses SysUtils, windows, messages;
function WndProc2(hClientWnd: THandle; Msg: integer; wParam: longint; lParam: longint; var MsgV1:TWMCopyData{MsgV1:Pointer}): longint; stdcall; forward;
//procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA;
{èíòåðôåéñû ê ñèñòåìíûì DLL}
var CreationCounter:integer=0; // Ñ÷åò÷èê ñîçäàííûõ ãëàâíûõ îêîí hClientWnd, hOtherWnd:THandle; msg1,msg2,msg3,msg4: integer;
MsgV: TWMCopyData; //Source :string; // sText: array[0..99] of Char;
procedure WMCopyData(var Msg: TWMCopyData); var sText: array[0..99] of Char; begin
Beep(1500,1500); StrLCopy(sText, Msg.CopyDataStruct.lpData, Msg.CopyDataStruct.cbData);
MessageBox(hClientWnd,sText,'Result',MB_OK or MB_ICONINFORMATION); end;
function WndProc2(hClientWnd: THandle; Msg: integer; wParam: longint; lParam: longint; var MsgV1:TWMCopyData): longint; stdcall; const IDedit=1; IDLabel=2;
var i,j:integer; rect:TRect; s:ShortString; CliCount:integer;
begin result:=0;
case Msg of WM_COPYDATA: begin Beep(1500,1500);
WMCopyData(MsgV);
end;
wm_create: {Îðãàíû óïðàâëåíèÿ ñîçäàþòñÿ ïðè ñîçäàíèè ãëàâíîãî îêíà} begin inc(CreationCounter); GetClientRect(hClientWnd,rect); //ðàçìåðû êëèåíòñêîé îáëàñòè
CreateWindowEx(WS_EX_CLIENTEDGE, // Óòîïëåííàÿ ðàìêà 'edit', '',// ïóñòîé òåêñò â ïîëå ââîäà ws_visible or ws_child or ws_tabstop or WS_GROUP or es_autohscroll, //Ãðóïïà çàêîí÷åíà, îòñþäà íà÷èíàåòñÿ ñëåäóþùàÿ 5,30, 50,25, //rect.right-10,25, hClientWnd, 1, //IDedit hInstance, nil);
CreateWindowEx(0, 'Static', 'Íîìåð, ïîëó÷åííûé îò ñåðâåðà', WS_CHILD or SS_LEFT or WS_VISIBLE, 8, 8, 250, 15, hClientWnd, 2, //IDLabel HInstance, nil);
end;
wm_close: begin PostMessage(hOtherWnd,msg4, 0, 0); postquitmessage(0); end;
wm_destroy: begin //Îðãàíû óïðàâëåíèÿ óíè÷òîæàþòñÿ àâòîìàòè÷åñêè dec(CreationCounter); if CreationCounter=0 then PostQuitMessage(0); end;
else begin if msg = msg2 then hOtherWnd := lparam; // çàïîìèíàåì õýíäë ñåðâåðà, êîòîðûé ïðèøåë â "Îòâåò" if msg = msg1 then result:=0; // ïðè ïîëó÷åíèè áðîäêàñò îò ñàìîãî ñåáÿ (è îò äðóãèõ êëèåíòîâ) íå îáðàáàòûâàòü if msg = msg3 then begin // ïðè ïîëó÷åíèè îò ñåðâåðà ID äëÿ ýòîãî êëèåíòà CliCount := wparam; // çàïîìèíàåì ïðèñëàííûé ID s := IntToStr(CliCount)+' '; SendDlgItemMessage(hClientWnd,IDedit,wm_settext,sizeof(s),integer(@s)+1); end; end; if msg = msg4 then postquitmessage(0); // ïðè ïîëó÷åíèè îò ñåðâåðà êîìàíäû íà çàêðûòèå
result:=DefDlgProc(hClientWnd,msg,wparam,lparam); end; end;
procedure WinMain; {Îñíîâíîé öèêë îáðàáîòêè ñîîáùåíèé} const szClassName2='Controls2'; var wndClass2:TWndClassEx; msg:TMsg;
begin wndClass2.cbSize:=sizeof(wndClass2); wndClass2.style:=0; wndClass2.lpfnWndProc:=@WndProc2; wndClass2.cbClsExtra:=0; wndClass2.cbWndExtra:=dlgwindowextra; wndClass2.hInstance:=hInstance; wndClass2.hIcon:=loadIcon(0, idi_Application); wndClass2.hCursor:=loadCursor(0, idc_Arrow); wndClass2.hbrBackground:=0;//GetStockObject(ltgray_Brush); wndClass2.lpszMenuName:=nil; wndClass2.lpszClassName:=szClassName2; wndClass2.hIconSm:=loadIcon(0, idi_Application);
RegisterClassEx(wndClass2);
hClientWnd:=CreateWindowEx(0, szClassName2, {èìÿ êëàññà îêíà} 'Êëèåíò', {çàãîëîâîê îêíà} ws_popupwindow or ws_sysmenu or ws_caption or ws_border or ws_visible, {ñòèëü îêíà} 650, {Left} 250, {Top} 300, {Width} 100, {Height} 0, {õýíäë ðîäèòåëüñêîãî îêíà} 0, {õýíäë îêîííîãî ìåíþ} hInstance, {õýíäë ýêçåìïëÿðà ïðèëîæåíèÿ} nil); {ïàðàìåòðû ñîçäàíèÿ îêíà}
msg1:=RegisterWindowMessage('Çàïðîñ'); msg2:=RegisterWindowMessage('Îòâåò'); msg3:=RegisterWindowMessage('Äàííûå'); msg4:=RegisterWindowMessage('Çàâåðøåíèå');
SendMessage(HWND_BROADCAST, msg1, 0, hClientWnd); if hOtherWnd = 0 then MessageBox(hClientWnd,'Íåò ïîäêëþ÷åíèÿ','Result',MB_OK or MB_ICONINFORMATION);
while GetMessage(msg,0,0,0) do begin {ïîëó÷èòü î÷åðåäíîå ñîîáùåíèå} if not IsDialogMessage(hClientWnd,msg) {Åñëè Windows íå ðàñïîçíàåò è íå îáðàáàòûâàåò êëàâèàòóðíûå ñîîáùåíèÿ êàê êîìàíäû ïåðåêëþ÷åíèÿ ìåæäó îêîííûìè îðãàíàìè óïðàâëåíèÿ, òîãäà ÷îîáùåíèå èäåò íà ñòàíäàðòíóþ îáðàáîòêó} then begin TranslateMessage(msg); {Windows òðàíñëèðóåò ñîîáùåíèÿ îò êëàâèàòóðû} DispatchMessage(msg); {Windows âûçîâåò îêîííóþ ïðîöåäóðó} end; end; {âûõîä ïî wm_quit, íà êîòîðîå GetMessage âåðíåò FALSE} end; //------------------------------------------
//------------------------------------------ begin WinMain; end.
|
! MetalFan | Для оформления фрагментов исходного кода используй кнопку "КОД" |
|