![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
KOL+VCL
Bartov © (2003-04-03 01:53:00)
У нас есть VCL форма (отделное приложение) на ней есть Edit.
На KOL форме(уже другое приложение) EditBox + Button.
Как сделать, чтоб при нажатии на Button передалось значение иp EditBox"а(KOL-приложение) в Edit(VCL-приложение).
Кладов (2003-04-15 15:27:00) [1]
А setlength нужен ли? Если все равно присваивается PChar строке, то и память должна выделяться сама, а строка обрезаться до ближайшего #0. Если в строке есть #0, то вместо st := должно бы быть Move( PCopyDataStruct( Msg.wParam )^.lpData^, st[ 1 ],
PCopyDataStruct( Msg.lParam )^.cbData );
Что если написать Result := TRUE; Вылетает?
mdw (2003-04-15 13:01:00) [2]
Она возникает, по моему при освобожнении памяти. Короче лови на мыло пример. Вроде работает.
BaRToV (2003-04-14 17:45:00) [3]А вот если client KOL-приложение, то вылетает ошибка и приложение закрывается.
function TForm1.KOLForm1Message(var Msg: tagMSG;
var Rslt: Integer): Boolean;
var
st: string;
begin
Result := FALSE;
if Msg.message = WM_COPYDATA then
begin
SetLength(st, PCopyDataStruct(Msg.lParam)^.cbData);
st := PChar(PCopyDataStruct(Msg.wParam)^.lpData);
( PCopyDataStruct(Msg.wParam) [10]
А вот если client KOL-приложение, то вылетает ошибка и приложение закрывается.
function TForm1.KOLForm1Message(var Msg: tagMSG;
var Rslt: Integer): Boolean;
var
st: string;
begin
Result := FALSE;
if Msg.message = WM_COPYDATA then
begin
SetLength(st, PCopyDataStruct(Msg.lParam)^.cbData);
st := PChar(PCopyDataStruct(Msg.wParam)^.lpData);
EditBox1.Text := st;
end;
end;
Ошибка возникает в st := PChar(PCopyDataStruct(Msg.wParam)^.lpData);
Как быть?!...
Bartov (2003-04-04 10:47:00) [4]
Спасибо, делаем...
mdw (2003-04-03 21:41:00) [5]
Примено вот так. Кромсал работающий кусок, может где и переборщил. Но принцип должен быть понятен.
В VCL
TFormX = class(TForm)
...
private
procedure WMCOPYDATA(var M: TMessage); message WM_COPYDATA;
...
end;
procedure TFormX.WM_COPYDATA(var M: TMessage);
var S: String;
begin
SetLength(S, PCopyDataStruct(M.LPARAM)^.cbData);
S:= PChar(PCopyDataStruct(M.LPARAM)^.lpData);
Edit.Text:= S;
M.Result:= 1;
end;
В KOL
...
var CopyDataStruct: TCopyDataStruct;
PCh: PChar;
...
PCh:= StrNew(PChar( Text));
with CopyDataStruct do begin
dwData:= 0;
lpData:= PCh;
cbData:= Length(S)+1;
end;
SendMessage(FindFindow("TFormX", "FormX"), WM_COPYDATA, Form.Handle, LPARAM(@CopyDataStruct));
StrDispose(PCh);
Bartov (2003-04-03 19:57:00) [6]
Всем спасибо за ответы.
Но лучше напишите код, хотябы пару сторк. Мне нужно string передавать.
Пипл, ну очень надо!!!
SPeller (2003-04-03 16:58:00) [7]
> GandalfTheWhite (03.04.03 11:23)
> Можно создать файл проецириемый в память, можно через сообщения
> (можно послать указатель на данные любого размера)...
WM_COPYDATA работает как раз через file mapping. А для передачи адреса.. ну так в этом сообщении и шлите указатель вместе с размером, потому что любое другое сообщение указатель-то передаст, но вот данные нет.
GandalfTheWhite (2003-04-03 11:23:00) [8]
Можно создать файл проецириемый в память, можно через сообщения (можно послать указатель на данные любого размера)...
SPeller (2003-04-03 11:11:00) [9]
2 Bartov
Я к тому, что KOL здесь ни при чём. Ты бы лучше спросил это в форуме по WinAPI, там тебе срезу же ответили бы. А если по теме, то в том случае, если твои данные <= 4 байт, то посылай любое сообщение, главное чтобы другая программа отфильтровала его от остальных. В противном же случае, если твои данные больше 4-х байт, то используй WM_COPYDATA.
mdw (2003-04-03 11:00:00) [10]
Одно приложение(KOL) посылает собщение (SendMessage), второе(VCL) - получает. В lParam, например, передавай указатель на буфер данных или сами данные, если <= 4 байт.
Bartov (2003-04-03 03:02:00) [11]
> Так же как и всегда.
А как?...
> Я так понял, вам нужно передать что-то из одного приложения в другое?
Да, да!!!
Очень срочно надо!!!
SPeller (2003-04-03 02:54:00) [12]
Так же как и всегда. Я так понял, вам нужно передать что-то из одного приложения в другое?