Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

получение строкового ресурса по 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


Наверх

Титульная страница Поиск, карта сайта Написать письмо