我在服务程序中开了一个窗口(类CTsapiWnd)用来接收外部其他程序发送的自定义消息(WM_USER+2330),但总是无法接收到消息,不知为什么?是因为Desktop的原因?还是因为我的窗口是在服务程序中用new分配堆的内存导致,如果是,我该怎么解决?请哪位高手帮我分析一下,谢谢!!!
 
class CTsapiWnd : public CWnd
{
  public:
      .......................
 void DoCreate()
 {
  CreateEx(0, AfxRegisterWndClass(CS_GLOBALCLASS), "",0,0,谢谢 0, 0, 0, 0, 0);
 }
 .........................
}
CTsapiWnd     * m_TsapiWndPtr;int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
ee=1;
m_TsapiWndPtr=NULL;
// initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
cerr << _T("Fatal Error: MFC initialization failed") << endl;
nRetCode = 1;
}
else
{   
     SERVICE_TABLE_ENTRY DispatchTable[] =
{
   { ServiceName, ServiceMain},
   { NULL,  NULL }
};
         StartServiceCtrlDispatcher(DispatchTable);
}
return nRetCode;
}
void WINAPI ServiceMain(DWORD argc, LPTSTR argv[])
{
//服务状态设置
hSStat = RegisterServiceCtrlHandler( ServiceName, ServerCtrlHandler); if (hSStat == 0) 
LogEvent (_T("Cannot register control handler"), 100, TRUE); LogEvent (_T("Control handler registered successfully"), 0, FALSE);
    HDESK   hdeskCurrent;
    HDESK   hdesk;
    HWINSTA hwinstaCurrent;
    HWINSTA hwinsta;    hwinstaCurrent = GetProcessWindowStation();
    if (hwinstaCurrent == NULL)
{
LogEvent(_T("get window station err"),0,FALSE);
      }    hdeskCurrent = GetThreadDesktop(GetCurrentThreadId());
    if (hdeskCurrent == NULL){
LogEvent(_T("get window desktop err"),0,FALSE);
        }    hwinsta = OpenWindowStation("winsta0", FALSE,
                                  WINSTA_ACCESSCLIPBOARD   |
                                  WINSTA_ACCESSGLOBALATOMS |
                                  WINSTA_CREATEDESKTOP     |
                                  WINSTA_ENUMDESKTOPS      |
                                  WINSTA_ENUMERATE         |
                                  WINSTA_EXITWINDOWS       |
                                  WINSTA_READATTRIBUTES    |
                                  WINSTA_READSCREEN        |
                                  WINSTA_WRITEATTRIBUTES);
    if (hwinsta == NULL)
{
LogEvent(_T("open window station err"),0,FALSE);
        
}    if (!SetProcessWindowStation(hwinsta))
{
LogEvent(_T("Set window station err"),0,FALSE);
     }    hdesk = OpenDesktop("default", 0, FALSE,
                            DESKTOP_CREATEMENU |
DESKTOP_CREATEWINDOW |
                            DESKTOP_ENUMERATE    |
                            DESKTOP_HOOKCONTROL  |
                            DESKTOP_JOURNALPLAYBACK |
                            DESKTOP_JOURNALRECORD |
                            DESKTOP_READOBJECTS |
                            DESKTOP_SWITCHDESKTOP |
                            DESKTOP_WRITEOBJECTS);
if (hdesk == NULL)
{
LogEvent(_T("Open desktop err"),0,FALSE);
        
} if (!SetThreadDesktop(hdesk))
{
LogEvent(_T("Set ThreadDesktop err"),0,FALSE);
     }
SetStatus(hSStat, SERVICE_START_PENDING);

m_TsapiWndPtr=new CTsapiWnd;           
m_TsapiWndPtr->DoCreate(); 
Sleep(1000);
      ..............................................
setStatus(hSStat, SERVICE_RUNNING);
LogEvent(_T("SERVICE_RUNNING"),0,FALSE);
    while(ee)
{
Sleep(1000);
}
SetStatus(hSStat, SERVICE_STOPPED);
LogEvent (_T("服务状态转为:SERVICE_STOP"), 0, FALSE);
}