Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.10.03;
Скачать: CL | DM;

Вниз

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

Текущий архив: 2002.10.03;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.012 c
7-8188
REL_
2002-07-26 10:12
2002.10.03
Серийный номер винчестера


1-7953
AFrolov
2002-09-20 17:39
2002.10.03
Как узнать выделена строка в StringGrid или нет?


1-7895
alxx
2002-09-20 18:28
2002.10.03
Checkbox ы в TListView


1-8048
Shadow
2002-09-22 16:46
2002.10.03
Рисование


8-8067
MJH
2002-06-01 16:44
2002.10.03
MJHF-EQ-DLL version 0.3