Форум: "WinAPI";
Текущий архив: 2002.10.03;
Скачать: [xml.tar.bz2];
Внизполучение строкового ресурса по handle Найти похожие ветки
← →
Serguar (2002-08-15 12:20) [0]Привет всем. У меня следующая ситуация: есть два приложения - сервер и клиент. У обоих есть два поля:
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 ?
← →
Ученик (2002-08-15 12:37) [1]WinApi: SetProp, GetProp
← →
Serguar (2002-08-15 13:44) [2]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 := "";)
Мож я че не так делаю ?
← →
Serguar (2002-08-15 13:46) [3]Ой, ошибка! У меня так err := GetProp(AMsg.LParam, PChar(S));
← →
Ученик (2002-08-15 13:49) [4]S : array[0..255] of Char или
SetLength(S, 255);
GetProp(AMsg.WParam, PChar(S));
SetLength(S, StrLen(PChar(S)));
Строка сначала пустая и память для нее не выделена
← →
Serguar (2002-08-15 14:32) [5]Все равно результат тот же. После вызова 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 14:48) [6]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;
← →
Ученик (2002-08-15 14:50) [7]Сорри, попробуй по аналогии
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;
← →
Serguar (2002-08-15 15:24) [8]Тогда уж через WM_COPYDATA посылать серверу по его FWinHwnd запрос на строку. Но мне бы хотелось узнать, существует ли какая нибудь возможность по SessionHwnd = RegisterWindowMessage(PChar("NewSession")), полученном в серверном приложении, получить эту самую "NewSession" в клиентском приложении, если последнему известен SessionHwnd;
← →
Ученик (2002-08-15 15:30) [9]Serguar © (15.08.02 15:24)
Что-то я совсем запутался с твоими переменными (точнее их названиями), если известен SessionHwnd=RegisterWindowMessage(PChar("NewSession")), то "NewSession" по SessionHwnd получить вроде нельзя
← →
Serguar (2002-08-15 15:37) [10]А хотелось бы...
← →
Ученик (2002-08-15 15:41) [11]>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:55) [12]Сервер посылает клиенту по запросу FPingHwnd:
SendMessage(ClientHwnd, FPingResponseHwnd, FWinHwnd, FSessionHwnd);
ClientHwnd - это наверное понятно, FPingResponseHwnd / FPingHwnd - так же регистрируется при помощи RegisterWindowMessage() на обоих приложениях
FWinHwnd - Handle окна серверного приложения, FSessionHwnd = RegisterWindowMessage(PChar("NewSession")). Клиент все это хозяйство получает нормально в WParam и LParam соответственно.
В принципе, я тепер могу послать серверу (по FWinHwnd) тип сообщения WM_COPYDATA и тот вернет все что нужно, но это лишняя посылка. Ведь должен же быть какой то способ выдернуть строку из уникального хендла, зарегистрированного для всех окон сессии.
← →
Ученик (2002-08-15 16:01) [13]На сервере:
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-16 12:34) [14]С атомами вроде разобрался и все работает. Спасибо за идею. ;-)
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.10.03;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c