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