Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.06.09;
Скачать: CL | DM;

Вниз

Передача строки в cообщении WM_COPYDATA   Найти похожие ветки 

 
bkv   (2003-05-29 11:28) [0]

Здравствуйте, мастера.
Возникла такая проблема.
Передаю из одного приложения другому сообщение WM_COPYDATA:
var
CD: TCopyDataStruct;
begin
...
// заполняю структурк, в lpdata помещаю текст из
// FileList : TStringList

CD.dwDAta:=1; CD.cbData:=StrLen(FileList.GetText+1); CD.lpData:=TifConverter^.FileList.GetText;

// Отправляю эту структуру приложению AppHandle
SendMessage(AppHandle, WM_COPYDATA, 0, LongInt(@CD));
..
end;

В Приложении AppHandle получаю сообщение:

procedure TfrmMain.WMCopyData(var WMMsg: TWMCopyData);
var
Data: TStringList;
begin
with WMMsg.CopyDataStruct^ do begin
Data:=TStringList.Create;
// Заливаю в Data: TStringList переданные строки
Data.SetText(PChar(lpData));
Data.SaveToFile("D:\Test3.txt");
Data.Free;
end;
end;

И получаю следующий результат:
в Data: TStringList содержатся нужные строки + строка какой то
абракодабры!
Например: Передаю: C:\WINNT\TEMP\P2F35A.tmp
Получаю: C:\WINNT\TEMP\P2F358.tmp
Њ Ш:бwlя
Т.е вместо одной переданной строки получаю две?
Почему, понять не могу.
Помогите!


 
Skier ©   (2003-05-29 11:38) [1]

Забыл главное выделить память.
Последовательность должна быть такой :

-GetMem(...);
-StrCopy(...)
-SendMessage(...)
-FreeMem(...)


 
bkv   (2003-05-29 12:10) [2]

Метод TStringList.Gettext сам выделяет память, или я не прав?


 
Skier ©   (2003-05-29 12:17) [3]

Выделяет. Мои извинения...Просмотрел.
тогда + 1 не нужно - StrLen(FileList.GetText + 1);
она уже прибавилась в ф-ции StrNew(...)
Не спасёт ?


 
MBo ©   (2003-05-29 12:24) [4]

s:=FileList.Text;
CD.dwDAta:=1;
CD.cbData:=Length(s);
CD.lpData:=s;// или poitner(s) или @s[1]

with WMMsg.CopyDataStruct^ do begin
SetLength(s,cbData);
Move(s[1],lpData^,cbData);
//так делать в данном случае необязательно, но скопировать данные необходимо, если они будут использоваться вне обработчика
with TStringList.Create do begin
Text:=s;;
SaveToFile("D:\Test3.txt");
Free;
end;
end;

StringList тоже использовать необязательно, можно просто записать строку в текстовый файл - в ней уже есть CRLF







 
___Nikolay ©   (2003-05-29 12:35) [5]

получатель:

procedure ReceiveMessage (var Msg: TMessage);
message WM_COPYDATA;
...
procedure TFormReceive.ReceiveMessage;
var
pcd: PCopyDataStruct;
begin
pcd := PCopyDataStruct(Msg.LParam);
Caption := PChar(pcd.lpData);
end;


отправитель:

procedure TFormXXX.Button1Click(Sender: TObject);
var
cd: TCopyDataStruct;
begin
cd.cbData := Length(Edit1.Text) + 1;
cd.lpData := PChar(Edit1.Text);
SendMessage(FindWindow("TFormReceive", nil), WM_COPYDATA, 0, LParam(@cd));
end;


 
bkv   (2003-05-29 12:37) [6]

Не спасет.


 
Skier ©   (2003-05-29 12:39) [7]

Shit. Всё ж таки StrLen даёт длину без #0
Напиши так : StrLen(FileList.GetText) + 1;


 
reonid ©   (2003-05-29 12:39) [8]

//StrLen(FileList.GetText+1); - бред
// надо
StrLen(FileList.GetText)+1;


 
reonid ©   (2003-05-29 12:40) [9]

Skier © (29.05.03 12:39)
:)


 
Skier ©   (2003-05-29 12:43) [10]

>reonid © (29.05.03 12:40)
Копал не в ту сторону...Слона сразу и не заметил. :)


 
bkv   (2003-05-29 13:22) [11]

> MBo ©
Почему необходимо испоьзовать длину передаваемой строки, ведь мы имеем дело с PChar, который сам определяет свою длину по завершающему 0 : #0?


 
bkv   (2003-05-29 14:30) [12]

Вообщем,я так ничего и не понял.

отправитель:

CD: TCopyDataStruct;
data: TStringList;
begin
...

CD.dwDAta:=1; CD.cbData:=StrLen(FileList.GetText+1); CD.lpData:=TifConverter^.FileList.GetText;

// специально в отправителе создаю TStringList и выполняю те же
// действия , что и в получателе:
Data:=TStringList.Create;
Data.SetText(Pchar(CD.lpData));
Data.SaveToFile("D:\Test1.txt");
Data.Free;
//- все нормально, использую метод SetText я помещаю в
//Data строки и никаких лишних строк не добавляется!


SendMessage(AppHandle, WM_COPYDATA, 0, LongInt(@CD));
end;

получатель:

procedure TfrmMain.WMCopyData(var WMMsg: TWMCopyData);
var
Data: TStringList;
begin
with WMMsg.CopyDataStruct^ do begin
Data:=TStringList.Create;
// Заливаю в Data: TStringList переданные строки
Data.SetText(PChar(lpData));
Data.SaveToFile("D:\Test3.txt");
Data.Free;
end;
end;
- а в получателе, при выполнении тех же действий я получаю
нужный текст + строку абракодабры!

Почему?????? И в отправителе и в получателе я ссылаюсь на один и тот-же участок памяти! Получается что во втором случае не завершающего 0 (#0) и поэтому добавляется еще одна строка?
Непойму! Помогите!!



 
Serginio   (2003-05-29 14:36) [13]

CD.dwDAta:=1;
CD.cbData:=StrLen(FileList.GetText)+1;// для #0 CD.lpData:=TifConverter^.FileList.GetText;



 
Skier ©   (2003-05-29 14:47) [14]

>bkv (29.05.03 14:30)
Ты ничего и не поймёшь если будешь игнорировать всё что тебе отвечают и гнуть своё...


 
MBo ©   (2003-05-29 16:29) [15]

>bkv
Я дал пример с использованием string, а не pchar.
в этой строке ошиька была, надо так:
Move(lpData^,s[1],cbData);



Страницы: 1 вся ветка

Текущий архив: 2003.06.09;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.022 c
1-26436
Eugie
2003-05-29 05:41
2003.06.09
Работа с OleSrver в потоке (TThread)


3-26409
Dimaz-z
2003-05-21 22:25
2003.06.09
Ещё одна проблема с упаковкой таблицы!!! Помогите пожалуйста!


1-26582
Dmitry_Bondarev
2003-05-28 14:33
2003.06.09
Как сделать разноцветные строки в ListBox?


1-26447
Rise
2003-05-28 18:35
2003.06.09
CLoseForm


1-26510
Maks Realov
2003-05-29 16:30
2003.06.09
Области видимости