2

私は Windows サービス プログラムを作成しています。このプログラムは、起動時に外部の exe ファイル ( notepad.exe. しかし、それは常に失敗します"unhandled win32 exception occured"

私の手順:

  1. コードをファイルにコンパイルしexeます: MemoryStatus.exe.
  2. 次のコマンドでサービスをインストールします。sc create MemoryStatus binpath=c:\MyServices\MemoryStatus.exe
  3. Windows コントロール パネルからサービスを見つけて、 をクリックしますStart
  4. エラーが発生...

誰かが私がしたことが間違っていることを示すのを助けることができますか?

void main()
{
    SERVICE_TABLE_ENTRY ServiceTable[2];
    ServiceTable[0].lpServiceName = _T("MemoryStatus_new_3");
    ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)**ServiceMain**;

    ServiceTable[1].lpServiceName = NULL;
    ServiceTable[1].lpServiceProc = NULL;

    StartServiceCtrlDispatcher(ServiceTable);

}
void ServiceMain(int argc, char** argv)
{
    int error;
    ServiceStatus.dwServiceType =   SERVICE_WIN32;
    ServiceStatus.dwCurrentState =  SERVICE_START_PENDING;
    ServiceStatus.dwControlsAccepted =  SERVICE_ACCEPT_STOP |   SERVICE_ACCEPT_SHUTDOWN;
    ServiceStatus.dwWin32ExitCode = 0;
    ServiceStatus.dwServiceSpecificExitCode = 0;
    ServiceStatus.dwCheckPoint = 0;
    ServiceStatus.dwWaitHint = 0;
    hStatus = RegisterServiceCtrlHandler(   _T("MemoryStatus_new_3"),   (LPHANDLER_FUNCTION)ControlHandler);
    if (hStatus == (SERVICE_STATUS_HANDLE)0)
    {
        // Registering Control Handler failed
        WriteToLog("Registering Control Handler failed\n");
        return;
    }

    // We report the running status to SCM.
    ServiceStatus.dwCurrentState =  SERVICE_RUNNING;
    SetServiceStatus (hStatus, &ServiceStatus);

    // Initialize Service
        startSvc();

    return;
}

void startSvc()
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    ZeroMemory( &pi, sizeof(pi) );
    ZeroMemory( &si, sizeof(si) );
    si.cb = sizeof(si);
    // Start the child process
    if(CreateProcess(_T("C:\\Program Files\\Source Insight 3\\Insight3.exe"), _T(""), NULL, NULL, FALSE, 0, FALSE, NULL, &si, &pi))
     {
      CloseHandle( pi.hProcess );
      CloseHandle( pi.hThread );
    }
     else 
     {
        hProcess = GetCurrentProcess();//get current process
        TerminateProcess(hProcess,0);         //close process
     }
}
4

1 に答える 1

1
CreateProcess(_T("C:\\Program Files\\Source Insight 3\\Insight3.exe"),

ここに問題があります。

プロセス名を変更可能な配列に格納します。

TCHAR szAppName[MAX_PATH];
StringCchCat(szAppName, _countof(szAppName), _T("C:\\Program Files\\Source Insight 3\\Insight3.exe"));
于 2013-03-11T03:49:31.840 に答える