안녕하세요...
VC로 작성된 DLL에서 WM_COPYDATA 메세지를 통해서 델파이로 받고자 합니다.
그런데... 받은 메세지에 아무것도 들어 오지 않아서 디버그 해보니 첫번째 배열에 #0 값이 들어 있습니다. 아래와 같이 코딩했는데... 뭐가 잘못 되었는지...
VC 에서 메세지를 받으면 정상적으로 들어 오는데... 델파이에서는 안되네요
고수님들의 한수 가르침을 받고 싶습니다.
델파이에서 ...
type
PLOG_MSG = ^TLOG_MSG;
TLOG_MSG = packed record
szLOG : array[0..6] of char;
nMsgLength : integer;
szMsg : array[0..1024] of char;
end;
......
procedure OnMsgGet(var Message : TMessage); message WM_COPYDATA;
.......
procedure TfrmxveServer.OnMsgGet(var Message : TMessage);
var
GetMsg : String;
LOG_MSG : PLOG_MSG;
begin
inherited;
if (message.msg = WM_COPYDATA) then begin
LOG_MSG := PCopyDataStruct(Message.lParam)^.lpData;
GetMsg := LOG_MSG;
end;
그리고 이경문님의 답변도 감사 합니다... 좀전것도 컴파일을 제대로 되구여... 단지 받을때 메모리 참조를 잘못하는 것 같습니다. 디버깅 해 보면 #0 값이 앞부분에 먼저 와 있구 나머지 데이터가 그 다음부터 채워져 있더라구여...
그럼 즐코 하세요...
김일배님께서 올려놓으신 소스입니다.
한번 저도 해볼겸 다음과 수정하여 테스트 해보았습니다.
동작은 잘됩니다만 원하시는 대답 될런지 모르겠습니다.
{송신측}
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
type
tData = Record
s: String[250];
end;
procedure TForm1.Button1Click(Sender: TObject);
var
wnn:HWND;
DataStruct: TCopyDataStruct;
Data: TData;
begin
wnn:=FindWindow('TFReceiver','FReceiver');
Data.s := '나는 구창민이다, 나는 18살이다..읔..돌날아온다..';
DataStruct.dwData := wnn;
DataStruct.cbData := SizeOf(TData);
DataStruct.lpData := @Data;
SendMessage(wnn, WM_COPYDATA,
wParam(Application.Handle), lParam(@DataStruct));
end;
{수신측}
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TFReceiver = class(TForm)
Memo1: TMemo;
private
{ Private declarations }
procedure WMCopyData(var Message: TWMCopyData); message WM_COPYDATA;
public
{ Public declarations }
end;
var
FReceiver: TFReceiver;
implementation
{$R *.DFM}
type
tData = Record
s: String[250];
end;
procedure TFReceiver.WMCopyData(var Message: TWMCopyData);
var
Data: TData;
begin
CopyMemory(@data,Message.CopyDataStruct^.lpData, SizeOf(TData));
Message.Result := 1;
Memo1.lines.add(Data.s);
end;
end.