Q&A

  • 쩌비님앙 전에 wm_copydata에 대한 자세한 설명 부탁 드립니다.
전에 wm_copydata로 배열을 넘길려고 바둥바둥 거린 넘인데영..

님의 답변이 소스를 보시고 구냥 안되신다고 그렇셨는데.

좀 구체적인 답변을 부탁 드릴려고요.

배열은 어차피 주소값을 가지는 포인트니깐...

DataStruct.lpData := @Data; -> DataStruct.lpData := Data; 씩으로 넘기면 되지 않나영...

포인터를 배우긴 배웠는데...

기억이 가물가물해서 잘 모르겠어요..

기억으로는 포인터를 가지는 변수를 만들어 주고

거기다가 배열의 주소값을 받아서.. 넘겨 주면 될것도 같은데..

잘 안돼네영...



님이 안돼다는 말은 wm_copydata로는 못 넘긴다는 말인지...

아님 포인트변수를 잘못 써서 그렇다는 건지..

잘 모르겠음다..



된다면 이왕이면 밑에 소스를 좀 수정해주시는 자비를 배풀어 주소소..

물을곳도 없고 막막하기만 합니다.



그럼 부탁드리고요

행복요..





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;

type

tData = Record

//s: String[250]; <- 요렇게는 잘 넘어 갑니다.

s : array[1..3] of String; <- 배열을 써서 넘길려니 이상한 글자가..

end;

var

Form1: TForm1;

implementation



{$R *.DFM}



procedure TForm1.Button1Click(Sender: TObject);

var

DataStruct: TCopyDataStruct;

Data: TData;

i : integer;

wnn:HWND;

begin

WinExec(Pchar('recieve.exe'), SW_SHOWNORMAL); <- 받을곳의 실행화일을 실행

for i := 1 to 3 do

begin

Data.s[i] := inttostr(i); <- 배열을 넣어준다.

end;

wnn:=FindWindow('Tform2','form2');

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

Tform2 = class(TForm)

Memo1: TMemo;

Edit1: TEdit;

procedure FormCreate(Sender: TObject);



private

{ Private declarations }

procedure WMCopyData(var Message: TWMCopyData); message WM_COPYDATA;

public

{ Public declarations }

end;

type

tData = Record

//s: String[250];

s : array[1..3] of String; <- 역시 배열로

end;



var

form2: Tform2;



implementation



{$R *.DFM}



procedure Tform2.WMCopyData(var Message: TWMCopyData);

var

Data: TData;

begin

CopyMemory(@data,Message.CopyDataStruct^.lpData, SizeOf(TData));

Message.Result := 1;

edit1.text := Data.s[1];

end;



1  COMMENTS
  • Profile
    최용일 2001.09.03 20:44
    안녕하세요. 최용일입니다.



    string( long string )과 string[250] ( shortstring )은 비슷하지만 완전히 다른 형입니다.



    string( long string )과 동적배열은 메모리 할당/해제를 자체적으로 하고, 지역적인 특성이



    있어서 외부 프로그램에서 접근하기가 힘듬니다.



    크기가 고정되어 있다면 shortstring형을 쓰시고,



    type

    TData = packed record

    s : array[1..3] of String[250];

    end;



    크기가 변해야 한다면 PChar, Pointer등의 형을 사용해서 메모리를 할당받은뒤에 사용하세요...



    type

    TData = packed record

    s : array[1..3] of PChar;

    end;



    메모리 할당/해제는 GetMem/FreeMem, New/Dispose함수를 사용하시면 됩니다.



    ^^ 항상 즐코하세요...



    델초보 wrote:

    > 전에 wm_copydata로 배열을 넘길려고 바둥바둥 거린 넘인데영..

    > 님의 답변이 소스를 보시고 구냥 안되신다고 그렇셨는데.

    > 좀 구체적인 답변을 부탁 드릴려고요.

    > 배열은 어차피 주소값을 가지는 포인트니깐...

    > DataStruct.lpData := @Data; -> DataStruct.lpData := Data; 씩으로 넘기면 되지 않나영...

    > 포인터를 배우긴 배웠는데...

    > 기억이 가물가물해서 잘 모르겠어요..

    > 기억으로는 포인터를 가지는 변수를 만들어 주고

    > 거기다가 배열의 주소값을 받아서.. 넘겨 주면 될것도 같은데..

    > 잘 안돼네영...

    >

    > 님이 안돼다는 말은 wm_copydata로는 못 넘긴다는 말인지...

    > 아님 포인트변수를 잘못 써서 그렇다는 건지..

    > 잘 모르겠음다..

    >

    > 된다면 이왕이면 밑에 소스를 좀 수정해주시는 자비를 배풀어 주소소..

    > 물을곳도 없고 막막하기만 합니다.

    >

    > 그럼 부탁드리고요

    > 행복요..

    >

    >

    > 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;

    > type

    > tData = Record

    > //s: String[250]; <- 요렇게는 잘 넘어 갑니다.

    > s : array[1..3] of String; <- 배열을 써서 넘길려니 이상한 글자가..

    > end;

    > var

    > Form1: TForm1;

    > implementation

    >

    > {$R *.DFM}

    >

    > procedure TForm1.Button1Click(Sender: TObject);

    > var

    > DataStruct: TCopyDataStruct;

    > Data: TData;

    > i : integer;

    > wnn:HWND;

    > begin

    > WinExec(Pchar('recieve.exe'), SW_SHOWNORMAL); <- 받을곳의 실행화일을 실행

    > for i := 1 to 3 do

    > begin

    > Data.s[i] := inttostr(i); <- 배열을 넣어준다.

    > end;

    > wnn:=FindWindow('Tform2','form2');

    > 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

    > Tform2 = class(TForm)

    > Memo1: TMemo;

    > Edit1: TEdit;

    > procedure FormCreate(Sender: TObject);

    >

    > private

    > { Private declarations }

    > procedure WMCopyData(var Message: TWMCopyData); message WM_COPYDATA;

    > public

    > { Public declarations }

    > end;

    > type

    > tData = Record

    > //s: String[250];

    > s : array[1..3] of String; <- 역시 배열로

    > end;

    >

    > var

    > form2: Tform2;

    >

    > implementation

    >

    > {$R *.DFM}

    >

    > procedure Tform2.WMCopyData(var Message: TWMCopyData);

    > var

    > Data: TData;

    > begin

    > CopyMemory(@data,Message.CopyDataStruct^.lpData, SizeOf(TData));

    > Message.Result := 1;

    > edit1.text := Data.s[1];

    > end;

    >