Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在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 - Fatal编程技术网

如何在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++;? 我尝试用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及更早版本中,您需要勾选“服务属性”对话框中“登录”选项卡下的“允许服务与桌面交互”复选框,以便您的服务显示消息框

当我运行这段代码时,我在调试器中永远看不到szKeyName的值,它进入消息框的if块,但从不显示消息框。不知道为什么


要使此功能正常工作以获取服务的显示名称或任何其他/更简单的方法来完成该任务,是否?

消息框将在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”进行了尝试
获取服务名称,并正确显示包含
“终端服务”
的消息框。