Witam

Pracuję nad pewnym programem, który ma być aplikacją Windows Service i który na nieszczęście musi korzystać z komponentu ActiveX. Wiem, że niektóre komponenty ActiveX mogą działać bez umieszczania ich na formularzu niestety ten nie, aby działał potrzebuje on okna które "wspiera" komponenty ActiveX. Tak więc wpadłem na pomysł aby utworzyć konsolową aplikację, którą można uruchomić jako Windows Service i utworzenie w niej nowego wątku, który tworzy okno wpierające komponenty ActiveX oraz umieszczenie na nim komponentu. Tak też uczyniłem. I wszystko działa dopóki nie uruchomię programu jako Windows Service. Komponent ten ma za zadanie przesyłać obraz pulpitu do programu klienta (podobne do VNC, TeamVeiwer) jednak po uruchomieniu jako Windows Service nie transmituje obrazu.
Zauważyłem że:

  • Komponent odbiera zdarzenia z programu klienta czyli prawidłowo wyświetla adres IP klienta, który się z nim połączył
  • W przypadku ustawienia funkcji blokującej dostęp do serwera aplikacja klienta reaguje poprawnie i wyświetla adekwatny komunikat
  • W przypadku aktywacji dostępu do serwera aplikacja klienta nie wyświetla komunikatu o braku połączenia (co jest ok) jednakże nie otrzymuje obrazu.
    Debugowanie doprowadziło mnie do pewnego punktu w programie a mianowicie do funkcji CALLBACK tworzonego okna, gdzie odnalazłem różnice w działaniu programu uruchomionego jako Windows Service albo jako aplikacja. Po uruchomieniu jako service funkcja kończy swoje działanie tuż po utworzeniu okna a w trybie aplikacji działa ciągle. Wiem że okno to się nie zamyka i komponent odpowiada na powyższe zdarzenia opisane wcześniej. Zastanawiam się czy to może mieć jakiś związek z tym że komponent nie transmituje obrazu.

Poniżej wspomniana funkcja :

 
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL CALLBACK D_DP(HWND hh,UINT mm,WPARAM ww,LPARAM ll)
{
	        switch(mm)
		{
		case WM_INITDIALOG:
  			{
			  ServerX::ISc_ServerX *pServer = 0;  //wskaźnik do interfejsu komponentu
		  	HWND hX = GetDlgItem(hh,801);
			  SendMessage(hX,AX_INPLACE,1,0);  //umieszczenie komponentu na formularzy
			  SendMessage(hX,AX_QUERYINTERFACE,(WPARAM)&__uuidof(ServerX::ISc_ServerX),(LPARAM)&pServer); //pobranie interfejsu komponentu do wskaźnika
			
			  if (pServer )
			  {	 
			      pServer ->put_AllowConnections(TRUE); //wywołanie jednej z dostępnych finkcji
			  }
			  pServer ->Release();
			  return true;
			}
		case WM_CLOSE:
			{
			    EndDialog(hh,IDCANCEL);
			    return 0;
			}

		case WM_SIZE:
			{
	                     HWND hX = GetDlgItem(hh,801);
			     RECT rc = {0};
			     GetClientRect(hh,&rc);
			     SetWindowPos(hX,0,0,0,rc.right,rc.bottom,SWP_HIDEWINDOW);
				
	  		return 0;
			}
		}
	return 0;
	}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Oraz wątek uruchamiający okno

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void ServerThread( void *dummy )
{
        HINSTANCE h = NULL;
	OleInitialize(0);
	if (!AXRegister())
	{	
           WriteToLog("nie moge zarejestrować klasy"); 
           return ;
        }
	DialogBox(NULL,"SERVER",GetConsoleHwnd(),D_DP); //uruchomienie okna
	
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 

Generalnie wiadomo że jeśli chodzi o ActiveX i Windows Server przeważnie są problemy. Czy ktokolwiek z Was spotkał się z podobnym problemem? (lub z jakimś innym komponentem w aplikacji Windows Service wymagającego użycia okna). Przypuszczam że to uruchomienie jako service w jakiś sposób blokuje okno tudzież komponent. Nadmienię jeszcze że uruchomienie service w trybie interaktywnym z pulpitem niczego nie zmienia. Będę wdzięczny za różnego rodzaju sugestie.
Pozdrawiam