如何在C++;? 我尝试用C++获得运行服务的显示名称。我试图使用GetServiceDisplayName函数,但它似乎不起作用,不知道为什么 TTServiceBegin( const char *svcName, PFNSERVICE pfnService, bool *svc, PFNTERMINATE pfnTerm, int flags, int argc, char *argv[], DWORD dynamiteThreadWaitTime ) { SC_HANDLE serviceStatusHandle; DWORD dwSizeNeeded = 0 ; TCHAR* szKeyName = NULL ; serviceStatusHandle=OpenSCManager(NULL, SERVICES_ACTIVE_DATABASE ,SC_MANAGER_ALL_ACCESS); GetServiceDisplayName(serviceStatusHandle,svcName, NULL, &dwSizeNeeded); if(dwSizeNeeded) { szKeyName = new char[dwSizeNeeded+1]; ZeroMemory(szKeyName,dwSizeNeeded+1); if(GetServiceDisplayName(serviceStatusHandle ,svcName,szKeyName,&dwSizeNeeded)!=0) { MessageBox(0,szKeyName,"Got the key name",0); } }
当我运行这段代码时,我在调试器中永远看不到szKeyName的值,它进入消息框的if块,但从不显示消息框。不知道为什么如何在C++;? 我尝试用C++获得运行服务的显示名称。我试图使用GetServiceDisplayName函数,但它似乎不起作用,不知道为什么 TTServiceBegin( const char *svcName, PFNSERVICE pfnService, bool *svc, PFNTERMINATE pfnTerm, int flags, int argc, char *argv[], DWORD dynamiteThreadWaitTime ) { SC_HANDLE serviceStatusHandle; DWORD dwSizeNeeded = 0 ; TCHAR* szKeyName = NULL ; serviceStatusHandle=OpenSCManager(NULL, SERVICES_ACTIVE_DATABASE ,SC_MANAGER_ALL_ACCESS); GetServiceDisplayName(serviceStatusHandle,svcName, NULL, &dwSizeNeeded); if(dwSizeNeeded) { szKeyName = new char[dwSizeNeeded+1]; ZeroMemory(szKeyName,dwSizeNeeded+1); if(GetServiceDisplayName(serviceStatusHandle ,svcName,szKeyName,&dwSizeNeeded)!=0) { MessageBox(0,szKeyName,"Got the key name",0); } },c++,winapi,visual-c++,windows-services,C++,Winapi,Visual C++,Windows Services,当我运行这段代码时,我在调试器中永远看不到szKeyName的值,它进入消息框的if块,但从不显示消息框。不知道为什么 要使此功能正常工作以获取服务的显示名称或任何其他/更简单的方法来完成该任务,是否?消息框将在Windows Vista和以后的版本中不可见,这是因为更改使服务在单独的会话()中运行,该会话()无法访问桌面,因此消息框对您不可见,已登录的用户 在Windows XP及更早版本中,您需要勾选“服务属性”对话框中“登录”选项卡下的“允许服务与桌面交互”复选框,以便您的服务显示消息框
要使此功能正常工作以获取服务的显示名称或任何其他/更简单的方法来完成该任务,是否?消息框将在Windows Vista和以后的版本中不可见,这是因为更改使服务在单独的会话()中运行,该会话()无法访问桌面,因此消息框对您不可见,已登录的用户 在Windows XP及更早版本中,您需要勾选“服务属性”对话框中“登录”选项卡下的“允许服务与桌面交互”复选框,以便您的服务显示消息框
相反,您可以将服务名称写入一个文件,或者运行一个用户应用程序,该应用程序接受要查询的服务名称,并让它查询和显示服务名称(我刚刚尝试使用发布的代码,它工作正常,显示消息框).在Windows Vista和更高版本上,该消息框将不可见,原因是有一项更改,该更改使服务运行在一个单独的会话()中,该会话()无法访问桌面,因此登录用户无法看到该消息框 在Windows XP及更早版本中,您需要勾选“服务属性”对话框中“登录”选项卡下的“允许服务与桌面交互”复选框,以便您的服务显示消息框
相反,您可以将服务名称写入一个文件,或者运行一个用户应用程序,该应用程序接受要查询的服务名称,并让它查询和显示服务名称(我刚刚尝试使用发布的代码,它工作正常,显示消息框).您需要使用WTSSendMessage而不是MessageBox与活动会话进行交互
WTS_SESSION_INFO* pSessionInfo = NULL;
DWORD dwSessionsCount = 0;
if(WTSEnumerateSessions(WTS_CURRENT_SERVER_HANDLE, 0, 1, &pSessionInfo, &dwSessionsCount))
{
for(int i=0; i<(int)dwSessionsCount; i++)
{
WTS_SESSION_INFO &si = pSessionInfo[i];
if(si.State == WTSActive)
{
DWORD dwIdCurrentSession = si.SessionId;
std::string strTitle = "Hello";
std::string strMessage = "This is a message from the service";
DWORD dwMsgBoxRetValue = 0;
if(WTSSendMessage(
WTS_CURRENT_SERVER_HANDLE,
dwIdCurrentSession,
(char*)strTitle.c_str(),
strTitle.size(),
(char*)strMessage.c_str(),
strMessage.size(),
MB_RETRYCANCEL | MB_ICONINFORMATION | MB_TOPMOST,
60000,
&dwMsgBoxRetValue,
TRUE))
{
switch(dwMsgBoxRetValue)
{
case IDTIMEOUT:
// Deal with TimeOut...
break;
case IDCANCEL:
// Deal With Cancel....
break;
}
}
else
{
// Deal With Error
}
break;
}
}
WTSFreeMemory(pSessionInfo);
}
WTS_SESSION_INFO*pSessionInfo=NULL;
DWORD DWSessionCount=0;
if(WTSEnumerateSessions(WTS\u当前\u服务器\u句柄、0、1、PSSessionInfo和DWSessionCount))
{
对于(int i=0;i您需要使用WTSSendMessage而不是MessageBox与活动会话交互
WTS_SESSION_INFO* pSessionInfo = NULL;
DWORD dwSessionsCount = 0;
if(WTSEnumerateSessions(WTS_CURRENT_SERVER_HANDLE, 0, 1, &pSessionInfo, &dwSessionsCount))
{
for(int i=0; i<(int)dwSessionsCount; i++)
{
WTS_SESSION_INFO &si = pSessionInfo[i];
if(si.State == WTSActive)
{
DWORD dwIdCurrentSession = si.SessionId;
std::string strTitle = "Hello";
std::string strMessage = "This is a message from the service";
DWORD dwMsgBoxRetValue = 0;
if(WTSSendMessage(
WTS_CURRENT_SERVER_HANDLE,
dwIdCurrentSession,
(char*)strTitle.c_str(),
strTitle.size(),
(char*)strMessage.c_str(),
strMessage.size(),
MB_RETRYCANCEL | MB_ICONINFORMATION | MB_TOPMOST,
60000,
&dwMsgBoxRetValue,
TRUE))
{
switch(dwMsgBoxRetValue)
{
case IDTIMEOUT:
// Deal with TimeOut...
break;
case IDCANCEL:
// Deal With Cancel....
break;
}
}
else
{
// Deal With Error
}
break;
}
}
WTSFreeMemory(pSessionInfo);
}
WTS_SESSION_INFO*pSessionInfo=NULL;
DWORD DWSessionCount=0;
if(WTSEnumerateSessions(WTS\u当前\u服务器\u句柄、0、1、PSSessionInfo和DWSessionCount))
{
对于(int i=0;i当我调试代码时,它不应该仍然出现吗?我在调试时无法让它显示,甚至无法获取szKeyName的值,即使当我观看它时,它说它找不到指定的symbol@Bullsfan127,我不熟悉调试器,因此无法对此发表评论。我使用“TermService”进行了尝试
,并正确显示包含“终端服务”的消息框
。但当我调试代码时,它不应该仍然出现吗?我在调试时无法让它显示,甚至无法获取szKeyName的值,即使当我观看它时,它说它找不到指定的symbol@Bullsfan127,我不熟悉调试器,因此无法对此发表评论。我使用“TermService”进行了尝试
获取服务名称,并正确显示包含“终端服务”
的消息框。