Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.48 MB
Время: 0.009 c
3-7797
Dmitry Toropov
2002-09-10 17:14
2002.10.03
ADO не работает


1-7902
PEC
2002-09-23 15:10
2002.10.03
Привет народ ! Авось кто поможет !


6-8085
Арсентьев
2002-07-30 12:50
2002.10.03
почта


14-8126
Anatoly Podgoretsky
2002-09-07 17:19
2002.10.03
День рождения у Андрея Юдина


3-7877
propeller
2002-09-13 00:08
2002.10.03
????Как хранить старые даты (1500-1600 года)????





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский