在服务程序ServiceMain中用CreateThread创建线程ShowMsgWindow,再在该线程中用CreateWindow创建窗口MsgWnd,该窗口的MsgWnd.hInstance怎么填?void WINAPI ServiceMain(DWORD dwArgc,LPTSTR *lpArgv)
{
   DWORD id;
   threadhandle=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ShowMsgWindow,0,0,&id);
   WaitForSingleObject(threadhandle,INFINITE);
}
DWORD WINAPI ShowMsgWindow( LPVOID lpParameter )
{
    WNDCLASS MsgWnd;
    HWND hWnd;
    MSG msg;
 
    MsgWnd.style = CS_HREDRAW | CS_VREDRAW;
    MsgWnd.cbClsExtra = 0;
    MsgWnd.cbWndExtra = 0;
    MsgWnd.hbrBackground = NULL;
    MsgWnd.hCursor = NULL;
    MsgWnd.hIcon = NULL;
    MsgWnd.hInstance = g_hInstance;  //这里怎么填?????
    MsgWnd.lpfnWndProc = MsgWndProc;
    MsgWnd.lpszMenuName = NULL;
    MsgWnd.lpszClassName = (CHAR *)SERVICENAME;
 
    if( !RegisterClass( &MsgWnd ) )
    {
        return 0;
    }
    hWnd = CreateWindow( SERVICENAME, "MsgWindow", WS_OVERLAPPEDWINDOW,
        0, 0, 0, 0, NULL, NULL, g_hInstance, NULL );  //这里g_hInstance怎么填?????
    if( hWnd == NULL )
    {
        return 0;
    }

解决方案 »

  1.   

    如果是mfc的程序
    可以用AfxGetInstanceHandle  获得这个handle如果不是mfc的程序,是sdk的,那么用一个全局变量保存以下这个handle
    你的入口函数,winmain是有这个东西的
      

  2.   

    谢谢楼上。我这个既不是mfc的程序也不是winmain函数,而是以main()入口的系统服务程序。我在写服务程序。所以其中会有ServiceMain()函数
    void main()
    {
    SERVICE_TABLE_ENTRY DispatchTable[] =
    {
    {SVRSERVICE_NAME, SERVICEStart},
    {NULL    , NULL    }
    };   StartServiceCtrlDispatcher(DispatchTable);
    }
      

  3.   

    HINSTANCE hInst = GetModuleHandle(NULL);
    试试
      

  4.   

    试过了,HINSTANCE hInst = GetModuleHandle(NULL); 不可以。请各位再想想办法
      

  5.   

    //用它吧,超级有用的.这是我珍藏多年的代码,嘿嘿~~
    HMODULE GetModuleFromAddr(PVOID p)
    {
        MEMORY_BASIC_INFORMATION m = {0};
        VirtualQuery(p, &m, sizeof(MEMORY_BASIC_INFORMATION));
        return (HMODULE) m.AllocationBase;
    }
    要获得自身的HMODULE,这样调用即可
     GetModuleFromAddr(ServiceMain);