Hello, Slava!
You wrote on Fri, 11 Mar 2011 16:17:14 +0300:
>> Естественно рассматривается случай, когда сервер запущен как приложение
>> и, к примеру, запущено их несколько экзепляров - т.е. FindWindow не
>> подойдет (если он вообшще актуален на 2.5).
SE> а что если найти главное окно этого процесса, а потом послать ему
SE> wm_syscommand(sc_close,..
SE> а найти перебором всех окон и поиском породившего процесса
SE> GetWindowThreadProcessId
Ага, сенкс. Небольшое копание в самом FB показало, что окно создается
всегда, когда приложение запускается как приложение (с параметром А,
смотрел в srvr_w32.cpp(parse_args, WinMain)).
Отключение иконки(N) на наличие окна не влияет.
Таким образом предложенный способ подходит технически, кроме одного НО.
В режиме приложения, и при наличии коннектов, сервер не даст закрыть себя,
без клика на диалогово окошке :(
Для моего случая (известные базы переводятся в шатдаун) это подойдет, но
общим решение не будет.
Тут или искать этот диалог и кликать на нем или просить патч в сервер, с
обработкой отдельного типа сообщений, аля:
window.cpp | 12 ++++++++++++
1 files changed, 12 insertions(+), 0 deletions(-)
diff --git a/window.cpp b/window.cpp
index 5c5465f..be559b5 100644
--- a/window.cpp
+++ b/window.cpp
@@ -233,6 +233,18 @@ LRESULT CALLBACK WindowFunc(HWND hWnd, UINT message,
WPARAM wParam, LPARAM lPara
}
break;
+ case FB_CLOSE:
+ if (usServerFlags & SRVR_non_service)
+ {
+ if (GetPriorityClass(GetCurrentProcess()) != NORMAL_PRIORITY_CLASS)
+ {
+ SetPriorityClass(GetCurrentProcess(), NORMAL_PRIORITY_CLASS);
+ }
+ fb_shutdown(0, fb_shutrsn_app_stopped);
+ //DestroyWindow(hWnd);
+ }
+ break;
+
case WM_COMMAND:
switch (wParam)
{
--
-=Перхоть - это пепел кипящего разума.=-
With best regards, Nikolay Ponomarenko