2012-06-26 19 views
2

我在写一个Windows服务程序,它会在启动时调用一个外部的exe文件,比如notepad.exe。但它总是失败,"unhandled win32 exception occured"如何在服务程序中调用exe程序?

我的步骤:

  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 
    } 
} 
+0

如果CreateProcess()失败,为什么你的进程会自杀?尝试删除该行为并查看异常是否消失。 – CoreTech

+0

非常感谢您的意见,但删除后仍然失败。并且当我仅在main()函数中调用startSvc()时,它会成功,但如果通过服务调用它,则失败... “wins.exe中0x00000000处未处理的异常:0xC0000005:访问冲突读取位置0x00000000”。 – user1482337

+0

你的代码真的有这条线吗?它不应该使用额外的* *编译:ServiceTable [0] .lpServiceProc =(LPSERVICE_MAIN_FUNCTION)* * ServiceMain * *; – CoreTech

回答

0
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")); 
+0

错误我认为传递第一个参数(它是LPCTSTR)的文字字符串是好的,但我认为你有正确的想法。 OP将_T(“”)作为第二个参数传递给CreateProcess - MSDN表示“此参数不能是指向只读内存的指针(例如const变量或**文字字符串**)。如果此参数为常量字符串,该函数可能会导致访问冲突。“ (强调加) – Spike0xff

相关问题