Как получить отображаемое имя службы в 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 для окна сообщения, но никогда не отображает окно сообщения. Не уверен почему?

В любом случае, чтобы заставить это работать, чтобы получить отображаемое имя службы или любой другой / более простой способ выполнить эту задачу?

Ответы на вопрос(2)

ерсиях из-за изменения, когда службы работают в отдельном сеансе (Сессия 0 Изоляция), который не имеет доступа к рабочему столу, поэтому окно сообщения не будет отображаться для вас, вошедшего в систему пользователя.

В Windows XP и более ранних версиях необходимо поставитьAllow service to interact with desktop флажок подLog On вкладка в диалоговом окне свойств сервиса для вашего сервиса, чтобы появилось окно сообщения.

Вместо этого вы можете записать имя службы в файл или запустить пользовательское приложение, которое принимает имя службы для запроса и запрашивает его и отображает имя службы (я только что попробовал с опубликованным кодом, и он работает правильно, отображая окно сообщения).

 Bullsfan12711 июл. 2012 г., 17:44
но разве это не должно появляться, когда я просто отлаживаю код? Я не могу заставить его показывать, когда я отлаживаю и даже не могу получить значение szKeyName, даже когда я смотрю его, он говорит, что не может найти указанный символ
 11 июл. 2012 г., 17:46
@ Bullsfan127, я не знаком с отладчиком, поэтому не могу это комментировать. Я попробовал это с"TermService" для имени службы, и он правильно отобразил окно сообщения, содержащее"Terminal Services".

твия с активным сеансом.

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);    
}

Ваш ответ на вопрос