Q&A

  • VC의 DLL 에서 보낸 메세지 를 델파이에서 받을때...
안녕하세요...

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;





2  COMMENTS
  • Profile
    loke 2001.04.10 06:13
    아래 김일배님이 올려놓으신 답변을 보고 그대로 하니까 해결 되네요^^

    그리고 이경문님의 답변도 감사 합니다... 좀전것도 컴파일을 제대로 되구여... 단지 받을때 메모리 참조를 잘못하는 것 같습니다. 디버깅 해 보면 #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.

  • Profile
    이경문 2001.04.10 04:43
    > GetMsg := LOG_MSG;



    이 부분이 컴파일이 되나요?

    제가 보기에는 Message를 받아서 LOG_MSG까지는 맞는 것 같은데

    GetMsg에 LOG_MSG를 대입하는 것이 이해가 되지 않는군요.

    GetMsg = LOGm_MSG.szMsg;

    이렇게 하는 것이 맞지 않을까요?