2012-03-26 21 views
1

私はWindowsサービスを作成するCアプリケーションを作成しています。インストール機能を呼び出す前にサービスがインストールされているかどうか確認したいが、チェックする方法は見つけられない。サービスがC言語を使用してインストールされているか確認してください

私がしようとする上記のコードを書いている:サービスがまだ存在するかどう

DWORD InstallMyService() 
{ 
    char strDir[1024 + 1]; 
    SC_HANDLE schSCManager; 
    SC_HANDLE schService; 
    LPCTSTR lpszBinaryPathName; 

    if (GetCurrentDirectory(1024, strDir) == 0) 
    { 
     aff_error("GetCurrentDirectory"); 
     return FALSE; 
    } 
    strcat(strDir, "\\"MY_SERVICE_BIN_NAME); 
    if ((schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS)) == NULL) 
    { 
     printf("Error OpenSCManager : %d\n", GetLastError()); 
     return FALSE; 
    } 
    lpszBinaryPathName = strDir; 
    schService = CreateService(schSCManager, MY_SERVICE_NAME, MY_SERVICE_DESCRIPTOR, 
          SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL, 
          lpszBinaryPathName, NULL, NULL, NULL, NULL, NULL); 
    if (schService == NULL) 
    { 
     printf("Error CreateService : %d\n", GetLastError()); 
     return FALSE; 
    } 
    CloseServiceHandle(schService); 
    return TRUE; 
} 

は、しかし、このコードは検出されません。誰かがどの機能を呼び出すのか考えていますか?私はこれについて多くの記事を見出しましたが、Cではなく、C#またはVBでしか見つかりませんでした。

ありがとうございます。

+0

失敗していますか?それは 'OpenSCManager'呼び出しか' GetServiceKeyName'呼び出しですか? – ChrisF

+0

サービスがまだ作成されている場合にのみ、OpenSCManagerが失敗するようです。 –

+0

あなた自身でソフトウェアをインストールしていますか?それがインストールされているかどうかを示すレジストリキーを作成してみませんか?私はあなたが特にインストールされているかどうかを問い合わせることはできないと思います。あなたは 'OpenService'でサービスを開こうとすることができます。失敗した場合は、サービスがインストールされていないことを示す指標ですが、正しく設定されていない可能性もあります。 – RedX

答えて

2

可能性を参照してくださいQueryServiceStatusEx

使用してみてください:これは希望

SC_HANDLE service_handle = CreateService(...); 
if (0 == service_handle) 
{ 
    if (ERROR_SERVICE_EXISTS == GetLastError()) 
    { 
     /* Handle service already exists. */ 
    } 
    else 
    { 
     /* Handle failure. */ 
    } 
} 

2つの機能を持つコードを少し変更する必要がありますInstallService()CheckService()は1つの機能を持っています(examp le)EnsureServiceInstalled()

それとも、あなたはERROR_SERVICE_DOES_NOT_EXISTGetLastError()コードで失敗しますOpenService()機能を、使用することができます:

SC_HANDLE scm_handle = OpenSCManager(0, 0, GENERIC_READ); 

if (scm_handle) 
{ 
    SC_HANDLE service_handle = OpenService(scm_handle, 
              "the-name-of-your-service", 
              GENERIC_READ); 
    if (!service_handle) 
    { 
     if (ERROR_SERVICE_DOES_NOT_EXIST != GetLastError()) 
     { 
      fprintf(stderr, 
        "Failed to OpenService(): %d\n", 
        GetLastError()); 
     } 
     else 
     { 
      /* Service does not exist. */ 
      fprintf(stderr, "Service does not exist.\n"); 
     } 
    } 
    else 
    { 
     fprintf(stderr, "Opened service.\n"); 
     CloseServiceHandle(service_handle); 
    } 

    CloseServiceHandle(scm_handle); 
} 
else 
{ 
    fprintf(stderr, 
      "Failed to OpenSCManager(): %d\n", 
      GetLastError()); 
} 
+0

私は1つの関数しか持っていませんでしたが、 'OpenSCManager'呼び出しが失敗する限り、' ERROR_SERVICE_EXISTS'が引き続きアプリケーション可能かどうかわかりません。 –

+0

いいえ、 'OpenSCManager()'関数は特定のサービスと無関係です。 'OpenSCManager()'が失敗した後に 'GetLastError()'値を取得できますか?これは問題の内容を示します。 – hmjd

+0

うーん、それはかなり奇妙です.OpenSCManagerの呼び出しはOKですが、今は1073エラーをスローするCreateServiceです。 CreateServiceコールを表示するために私の投稿を更新します。 –

0

それはERROR_SERVICE_EXISTSに等しい場合、常にCreateService()に、失敗クエリGetLastError()場合しようとチェックすることです例here

関連する問題