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

Reply via email to