描述:
我是在Win32 Service程序中创建了一个隐含窗口,然后在另外一个对话框程序中查找这个隐含窗口,
在2000/XP 下,用VC自带的Spy++可以看到这个隐含窗口,可是在2003 Server中就看不到(可是创建窗口已经成功了),这是为什么?
服务程序如下:
void AgIceRunService(AGICE_VOID)
{
//COPYDATASTRUCT pcds;
MSG msg;
//create window to handle msgs
hWnd = AgIceBuildHiddenWindow();
if(AGICE_NULL == hWnd)
{
AGICE_WRITE_LOG(0, "Failed to create window for service!\n");
return;
}
else
{
AGICE_WRITE_LOG(0, "Successful to create window for service!\n");
}
AGICE_WRITE_LOG(0, "Begin to handle windows msg!\n");
while(-1 != GetMessage(&msg, hWnd, 0, 0))
{
AGICE_WRITE_LOG(0, "Handle window msg after receiving it!\n");
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
/********************************************************************
*
* Fun: AgIceMakeWorkerWindow
*
* Desc:
*
* Notes: n/a
*
* Parameters:
*********************************************************************/
HWND AgIceBuildHiddenWindow(AGICE_VOID)
{
WNDCLASS wndclass;
HWND hWindow;
memset(&wndclass, 0, sizeof(WNDCLASS));
wndclass.style = CS_GLOBALCLASS;
wndclass.lpfnWndProc = (WNDPROC)AgIceWindowProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = AGICE_NULL;
wndclass.hIcon = LoadIcon(AGICE_NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(AGICE_NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = AGICE_NULL;
wndclass.lpszClassName = DEF_WINDOW_CLASS;
if (RegisterClass(&wndclass) == 0)
{
AGICE_WRITE_LOG(0, "RegisterClass() failed with error %d\n");
return AGICE_NULL;
}
// Create a window.
hWindow = CreateWindowEx(AGICE_NULL,
DEF_WINDOW_CLASS,
"Myexe",
WS_OVERLAPPED | WS_MINIMIZE,
1,
1,
1,
1,
AGICE_NULL,
AGICE_NULL,
AGICE_NULL,
AGICE_NULL);
if (hWindow == AGICE_NULL)
{
AGICE_WRITE_LOG(0, "CreateWindow() for Myexe failed!\n");
return AGICE_NULL;
}
return hWindow;
}
void WINAPI ServiceMain(DWORD argc, LPTSTR* argv)
{
// Register the control request handler
status.dwServiceType = SERVICE_WIN32_SHARE_PROCESS
| SERVICE_INTERACTIVE_PROCESS ;
status.dwCurrentState = SERVICE_START_PENDING;
status.dwControlsAccepted = 0;
status.dwWin32ExitCode = 0;
status.dwServiceSpecificExitCode = 0;
status.dwCheckPoint = 0;
status.dwWaitHint = 10000;
hServiceStatus = RegisterServiceCtrlHandler(DEF_SERVICE_NAME, ServiceCtrl);
if(0 == hServiceStatus)
{
return;
}
if (!SetServiceStatus(hServiceStatus, &status)) {
}
status.dwServiceType = SERVICE_WIN32_SHARE_PROCESS
| SERVICE_INTERACTIVE_PROCESS ;
status.dwCurrentState = SERVICE_RUNNING;
status.dwCheckPoint = 0;
status.dwWaitHint =0;
status.dwControlsAccepted = SERVICE_ACCEPT_STOP|SERVICE_ACCEPT_PAUSE_CONTINUE;
if (!SetServiceStatus(hServiceStatus, &status))
{
}
AGICE_WRITE_LOG(0, "Begin to create hidden window!\n");
AgIceRunService();
return;
}
void WINAPI ServiceCtrl(DWORD dwOpcode)
{
//COPYDATASTRUCT pcds;
switch(dwOpcode)
{
case SERVICE_CONTROL_PAUSE:
status.dwCurrentState = SERVICE_PAUSED;
// Send current status.
if (!SetServiceStatus (hServiceStatus, &status))
{
AGICE_WRITE_LOG(0, "Failed to change the status of service!\n");
}
break;
case SERVICE_CONTROL_CONTINUE:
status.dwCurrentState = SERVICE_RUNNING;
// Send current status.
if (!SetServiceStatus (hServiceStatus, &status))
{
AGICE_WRITE_LOG(0, "Failed to change the status of service!\n");
}
break;
case SERVICE_CONTROL_STOP:
status.dwWin32ExitCode = 0;
status.dwCurrentState = SERVICE_STOPPED;
status.dwCheckPoint = 0;
status.dwWaitHint = 0;
//set service status
if (!SetServiceStatus (hServiceStatus, &status))
{
AGICE_WRITE_LOG(0, "Failed to stop service!\n");
}
return;
case SERVICE_CONTROL_INTERROGATE:
// Fall through to send current status.
&n