创建服务程序可以参考https://blog.csdn.net/chenyujing1234/article/details/8023816
此处为调用exe文件,在进程中和前台都可以显示。以下部分为主要代码。
BOOL Sever::RunProcess(const std::string path)
{
STARTUPINFO si = { 0 };
// 进程信息
PROCESS_INFORMATION pi = { 0 };
si.cb = sizeof(si);
// 获得当前Session ID
DWORD dwSessionID = WTSGetActiveConsoleSessionId();
HANDLE hToken = NULL;
// 获得当前Session的用户令牌
if (::WTSQueryUserToken(dwSessionID, &hToken) == FALSE)
{
return FALSE;
}
HANDLE hDuplicatedToken = NULL;
if (DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, NULL, SecurityIdentification, TokenPrimary, &hDuplicatedToken) == FALSE)
{
return FALSE;
}
// 创建用户Session环境
LPVOID lpEnvironment = NULL;
if (CreateEnvironmentBlock(&lpEnvironment, hDuplicatedToken, FALSE) == FALSE)
{
return FALSE;
}
//WCHAR lpszClientPath[MAX_PATH];
wchar_t * lpszClientPath = new wchar_t[MAX_PATH];
swprintf(lpszClientPath, MAX_PATH,L"%S ", path.c_str());//注意大写S。
// if (GetModuleFileName(NULL, lpszClientPath, MAX_PATH) == 0)
// {
// return FALSE;
// }
//PathRemoveFileSpec(lpszClientPath);
wcscat(lpszClientPath,L" ");
fprintf(file, "path! %s\n", lpszClientPath);
DWORD dwCreationFlags = NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE | CREATE_UNICODE_ENVIRONMENT;
if (CreateProcessAsUser(hDuplicatedToken, lpszClientPath, NULL, NULL, NULL, FALSE, dwCreationFlags, lpEnvironment, NULL, &si, &pi) == TRUE)
{
fprintf(file, "CreateProcessAsUser ok!\n");
}
else
{
fprintf(file, "CreateProcessAsUser false!\n");
}
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
delete[]lpszClientPath;
lpszClientPath = NULL;
return TRUE;
}
注:1.如果服务启动后就自动关闭有可能系统缺少必要的库可以用 DirectX_Repair修复工具进行修复
2.一定不要用远程桌面进行启动。这样通过调用WTSQueryUserToken()在会话上获取用户令牌,错误代码为1008.则导致程序无法正常运行.