![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
получение строкового ресурса по handle [D5, WinXP]
Serguar © (2002-08-15 12:20:00)Привет всем. У меня следующая ситуация: есть два приложения - сервер и клиент. У обоих есть два поля:
FSessionName: string;
FSessionHandle: Longint;
Сервер при открытии делает
FSessionHandle := RegisterWindowMessage(PChar(FSessionName));
(значение FSessionName уже присвоено, ну допустим "NewSession" )
Клиент работает с сервером только если у них одинаковое значение
этого поля. Для получения списка всех серверов (значения их FSessionName) клиент делает посылку
SendMessage(HWND_BROADCAST, FPingHwnd, FWinHwnd, 0);
Все серверы получившие данное сообщение отсылают клиенту
if AMsg.Msg = FPingHwnd then begin
ClientHwnd := AMsg.wParam;
if ClientHwnd <> 0 then begin
SendMessage(ClientHwnd, FPingResponseHwnd, FWinHwnd, FSessionHwnd);
end;
Клиент все это получает, но вот вопрос: как по полученному FSessionHwnd вытащить строковый ресурс FSessionName ?
Serguar (2002-08-16 12:34:00) [1]С атомами вроде разобрался и все работает. Спасибо за идею. ;-)
Ученик (2002-08-15 16:01:00) [2]На сервере:
Win32Check(SetProp(FWinHwnd, "SessionName", GlobalAddAtom("Session1")));
end;
На клиенте:
var
szSessionName : array[0..255] of Char;
begin
Win32Check(GlobalGetAtomName(GetProp(WParam, "SessionName"), szSessionName, 255) > 0);
Serguar (2002-08-15 15:55:00) [3]Сервер посылает клиенту по запросу FPingHwnd:
SendMessage(ClientHwnd, FPingResponseHwnd, FWinHwnd, FSessionHwnd);
ClientHwnd - это наверное понятно, FPingResponseHwnd / FPingHwnd - так же регистрируется при помощи RegisterWindowMessage() на обоих приложениях
FWinHwnd - Handle окна серверного приложения, FSessionHwnd = RegisterWindowMessage(PChar("NewSession")). Клиент все это хозяйство получает нормально в WParam и LParam соответственно.
В принципе, я тепер могу послать серверу (по FWinHwnd) тип сообщения WM_COPYDATA и тот вернет все что нужно, но это лишняя посылка. Ведь должен же быть какой то способ выдернуть строку из уникального хендла, зарегистрированного для всех окон сессии.
Ученик (2002-08-15 15:41:00) [4]>Serguar © (15.08.02 12:20)
if AMsg.Msg = FPingHwnd then begin
ClientHwnd := AMsg.wParam;
if ClientHwnd <> 0 then begin
SendMessage(ClientHwnd, FPingResponseHwnd, FWinHwnd, FSessionHwnd);
end;
FWinHwnd - это что ?
Serguar (2002-08-15 15:37:00) [5]А хотелось бы...
Ученик (2002-08-15 15:30:00) [6]Serguar © (15.08.02 15:24)
Что-то я совсем запутался с твоими переменными (точнее их названиями), если известен SessionHwnd=RegisterWindowMessage(PChar("NewSession")), то "NewSession" по SessionHwnd получить вроде нельзя
Serguar (2002-08-15 15:24:00) [7]Тогда уж через WM_COPYDATA посылать серверу по его FWinHwnd запрос на строку. Но мне бы хотелось узнать, существует ли какая нибудь возможность по SessionHwnd = RegisterWindowMessage(PChar("NewSession")), полученном в серверном приложении, получить эту самую "NewSession" в клиентском приложении, если последнему известен SessionHwnd;
Ученик (2002-08-15 14:50:00) [8]Сорри, попробуй по аналогии
procedure TForm1.Button1Click(Sender: TObject);
begin
Win32Check(SetProp(Handle, "SessionName", GlobalAddAtom("Session1")))
end;
procedure TForm1.Button2Click(Sender: TObject);
var
szSessionName : array[0..255] of Char;
begin
Win32Check(GlobalGetAtomName(GetProp(Handle, "SessionName"), szSessionName, 255) > 0);
ShowMessage(StrPas(szSessionName))
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
GlobalDeleteAtom(GetProp(Handle, "SessionName"))
end;
Ученик (2002-08-15 14:48:00) [9]procedure TForm1.Button1Click(Sender: TObject);
begin
Win32Check(SetProp(Handle, "SessionName", GlobalAddAtom("Session1")));
end;
procedure TForm1.Button2Click(Sender: TObject);
var
szSessionName : array[0..255] of Char;
begin
Win32Check(GlobalGetAtomName(, szSessionName, 255) > 0);
ShowMessage(StrPas(szSessionName))
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
GlobalDeleteAtom(GetProp(Handle, "SessionName"))
end;
Serguar (2002-08-15 14:32:00) [10]Все равно результат тот же. После вызова GetProp(AMsg.LParam, PCahr(S)) ф-я StrLen(PChar(S)) возвращает 0. По моему здесь дело не в этом.
function RegisterWindowMessage(Str: PChar): Word;
Опpеделяет уникальное оконное сообщение для всей системы.
Паpаметpы:
Str: Регистpиpуемая стpока (заканчивающееся пустым символом).
Возвpащаемое значение:
В случае успешного завеpшения возвpащает идентификатоp сообщения ($C000 - $FFFF); 0 - в пpотивном случае
function GetProp(Wnd: HWnd; Str: PChar): THandle;
Считывает из списка свойств окон описатель соответствующих данных.
Паpаметpы:
Wnd: Идентификатоp окна.
Str: Стpока (заканчивающаяся пустым символом) или атом.
Возвpащаемое значение:
Описатель данных, если список свойств содеpжит Str; 0 - в пpотивном случае
Кажется это не совсем тот вариант.
Ученик (2002-08-15 13:49:00) [11]S : array[0..255] of Char или
SetLength(S, 255);
GetProp(AMsg.WParam, PChar(S));
SetLength(S, StrLen(PChar(S)));
Строка сначала пустая и память для нее не выделена
Serguar (2002-08-15 13:46:00) [12]Ой, ошибка! У меня так err := GetProp(AMsg.LParam, PChar(S));
Serguar (2002-08-15 13:44:00) [13]OK, но после того как
var
S: String;
err: Hwnd;
begin
if AMsg.Msg = FPingResponseHwnd then begin
err := GetProp(AMsg.WParam, PChar(S));
if Assigned(FOnPingResponse) then FOnPingResponse(AMsg.WParam);
end;
err = 0, а в S ничего нет (S := "";)
Мож я че не так делаю ?
Ученик (2002-08-15 12:37:00) [14]WinApi: SetProp, GetProp