在服务程序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;
}
{
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;
}
可以用AfxGetInstanceHandle 获得这个handle如果不是mfc的程序,是sdk的,那么用一个全局变量保存以下这个handle
你的入口函数,winmain是有这个东西的
void main()
{
SERVICE_TABLE_ENTRY DispatchTable[] =
{
{SVRSERVICE_NAME, SERVICEStart},
{NULL , NULL }
}; StartServiceCtrlDispatcher(DispatchTable);
}
试试
HMODULE GetModuleFromAddr(PVOID p)
{
MEMORY_BASIC_INFORMATION m = {0};
VirtualQuery(p, &m, sizeof(MEMORY_BASIC_INFORMATION));
return (HMODULE) m.AllocationBase;
}
要获得自身的HMODULE,这样调用即可
GetModuleFromAddr(ServiceMain);