以NT Service为例,假设工程名称为MgrServer。在MgrServer.cpp加入如下代码:// 对Server进行初始化,设置其安全特性 Added by XXX 2001/10/23 extern "C" BOOL WINAPI InitApplication() { HRESULT hResult = CoInitialize(NULL); if (FAILED(hResult)) return FALSE; // failed to initialize COM // 这里设置权限为最低(允许任何人访问),其它的权限设置参见MSDN CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_NONE, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL); // 其它初始化代码 …… // 初始化成功 return TRUE; }然后在MgrServer.cpp中的Run()中作如下更改。 void CServiceModule::Run() { _Module.dwThreadID = GetCurrentThreadId(); // 注释掉的为ATL自动生成的代码 /* HRESULT hr = CoInitialize(NULL); // If you are running on NT 4.0 or higher you can use the following call // instead to make the EXE free threaded. // This means that calls come in on a random RPC thread // HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); _ASSERTE(SUCCEEDED(hr)); // This provides a NULL DACL which will allow access to everyone. CSecurityDescriptor sd; sd.InitializeFromThreadToken(); hr = CoInitializeSecurity(sd, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL); // 当然也可以直接在这里设置,而不必添加InitApplication(),但添加后结构更清晰 _ASSERTE(SUCCEEDED(hr)); */ /////////////////////////////////Added by XXX 2001/10/23 HRESULT hr = S_OK; if (!InitApplication()) return; /////////////////////////////////End adding ...... }
extern "C" BOOL WINAPI InitApplication()
{
HRESULT hResult = CoInitialize(NULL);
if (FAILED(hResult))
return FALSE; // failed to initialize COM // 这里设置权限为最低(允许任何人访问),其它的权限设置参见MSDN
CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_NONE,
RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);
// 其它初始化代码
……
// 初始化成功
return TRUE;
}然后在MgrServer.cpp中的Run()中作如下更改。
void CServiceModule::Run()
{
_Module.dwThreadID = GetCurrentThreadId(); // 注释掉的为ATL自动生成的代码
/* HRESULT hr = CoInitialize(NULL);
// If you are running on NT 4.0 or higher you can use the following call
// instead to make the EXE free threaded.
// This means that calls come in on a random RPC thread
// HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); _ASSERTE(SUCCEEDED(hr)); // This provides a NULL DACL which will allow access to everyone.
CSecurityDescriptor sd;
sd.InitializeFromThreadToken();
hr = CoInitializeSecurity(sd, -1, NULL, NULL,
RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL); // 当然也可以直接在这里设置,而不必添加InitApplication(),但添加后结构更清晰
_ASSERTE(SUCCEEDED(hr)); */
/////////////////////////////////Added by XXX 2001/10/23
HRESULT hr = S_OK;
if (!InitApplication())
return;
/////////////////////////////////End adding
......
}