Форум: "Основная";
Текущий архив: 2003.06.09;
Скачать: [xml.tar.bz2];
ВнизПередача строки в 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.009 c