我正在写一个DLL可能运行在一个服务的上下文中,并可能被加载到一个标准的win32进程。 我如何检测它是在服务的上下文中还是在标准的win32进程中运行?
根据Vista中引入的会话0隔离 ,Windows服务在会话0中运行。要确定进程是否在会话0中执行,可以使用ProcessIdToSessionId函数:
DWORD session_id; if (ProcessIdToSessionId(GetCurrentProcessId(), &session_id)) { std::cout << "session_id=" << session_id << "\n"; } else { std::cout << "Failed : " << GetLastError() << "\n"; }
关于您对GUI的评论,请直接从链接的文档中引用:
由于会话0不再是用户会话,因此会话0中运行的服务无法访问视频驱动程序。 这意味着,任何服务对于渲染图形的尝试都会失败。