在線急等:為什麼我在service裡用WinExec調用另外一個windows程式老是沒反應阿?大俠幫忙

时间:2021-11-07 16:03:18
為什麼我在service裡用WinExec調用另外一個windows程式老是沒反應阿?大俠幫忙阿

11 个解决方案

#1


是不是service裡不可以調win應用阿?

#2


用ShellExecute试试呢

#3


路径呢?
我给段代码给你看看!
sprintf(szBuffer, "MoveKey Init.ini %s", szMac);
       WinExec(szBuffer, SW_HIDE);

#4


現在發現一個重要的問題,就是如果路徑裡寫的是一個網絡路徑,就不會成功,但是本極路徑就可以
例如:T盤為映射到其他機器的盤符,以下代碼就不能正確執行
    char cm[120];
    sprintf(cm, "T:\\exe\\myprogram.exe");
    WinExec(cm, SW_SHOW);
該怎麼解決呢?難道就沒有辦法在一個服務裡執行遠端的程序嗎?

#5


如果想你这样就能执行远端的程序,那网络也太不安全了,一般来讲,需要在远端机器上运行一个程序,由该程序来执行相应的命令。

#6


我想你理解錯了吧
我的意思只是在本極上執行遠端程序的備份,並不會對遠端機器造成不安全的因素
就好比執行一個自動更新的程序將補丁包執行到本極阿

#7


頂一下,幫忙阿

#8


又一个*同胞?......

#9


俺是大陸同胞
發現在服務程序裡執行DirectoryExists(path)或FileExists(filename)都返回false,而在不同的程序裡都是成功的.
不知怎麼解決啊?
難道真的要我在遠端機器上再寫個服務嗎(就為了調用遠端機器上的一個程序)?是不是除此之外沒有辦法了?!

#10


大俠救命啊:)

#11


就沒人給一個確切的答案麼?
恳请专家指教:写了一个windows系统服务,但是在服务里调用远程映像盘上的外部程序不成功?

我使用C++Builder写了一个windows系统服务,用以在系统时间到达时调用一个已编译好
的应用程序,这个程序放在远程机器上,但是不知为何,其并没有调用成功.(无论是用方
法1还是方法2都不成功!!)
请问是什么原因造成的呢?调用本地程序是可以正确执行的,是不是在服务程序里不可以
调用远程机器上的应用程序呢?
以下为程序中的调用代码,V:为一映像盘:
void __fastcall TFmMain::RunProg(AnsiString ExePath)
{
    char cm[120];
    sprintf(cm, "V:\user\kaiser\test\Prog.exe /Skaiser /Dzdata /P /N /L:1");

//-----------方法1-----------
    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    ZeroMemory( &si, sizeof(si) );
    si.cb = sizeof(si);
    ZeroMemory( &pi, sizeof(pi) );

    // Start the child process.
    if( !CreateProcess( NULL, // No module name (use command line).
        cm,               // Command line.
        NULL,             // Process handle not inheritable.
        NULL,             // Thread handle not inheritable.
        FALSE,            // Set handle inheritance to FALSE.
        0,                // No creation flags.
        NULL,             // Use parent's environment block.
        NULL,             // Use parent's starting directory.
        &si,              // Pointer to STARTUPINFO structure.
        &pi )             // Pointer to PROCESS_INFORMATION structure.
    )
    {
        LogWrite( "CreateProcess failed." );
    }

    // Wait until child process exits.
    WaitForSingleObject( pi.hProcess, INFINITE );

    // Close process and thread handles.
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );

   //-----------方法2-----------
    WinExec(cm, SW_HIDE);
}
//--------------------------------------------------------------------------
-




#1


是不是service裡不可以調win應用阿?

#2


用ShellExecute试试呢

#3


路径呢?
我给段代码给你看看!
sprintf(szBuffer, "MoveKey Init.ini %s", szMac);
       WinExec(szBuffer, SW_HIDE);

#4


現在發現一個重要的問題,就是如果路徑裡寫的是一個網絡路徑,就不會成功,但是本極路徑就可以
例如:T盤為映射到其他機器的盤符,以下代碼就不能正確執行
    char cm[120];
    sprintf(cm, "T:\\exe\\myprogram.exe");
    WinExec(cm, SW_SHOW);
該怎麼解決呢?難道就沒有辦法在一個服務裡執行遠端的程序嗎?

#5


如果想你这样就能执行远端的程序,那网络也太不安全了,一般来讲,需要在远端机器上运行一个程序,由该程序来执行相应的命令。

#6


我想你理解錯了吧
我的意思只是在本極上執行遠端程序的備份,並不會對遠端機器造成不安全的因素
就好比執行一個自動更新的程序將補丁包執行到本極阿

#7


頂一下,幫忙阿

#8


又一个*同胞?......

#9


俺是大陸同胞
發現在服務程序裡執行DirectoryExists(path)或FileExists(filename)都返回false,而在不同的程序裡都是成功的.
不知怎麼解決啊?
難道真的要我在遠端機器上再寫個服務嗎(就為了調用遠端機器上的一個程序)?是不是除此之外沒有辦法了?!

#10


大俠救命啊:)

#11


就沒人給一個確切的答案麼?
恳请专家指教:写了一个windows系统服务,但是在服务里调用远程映像盘上的外部程序不成功?

我使用C++Builder写了一个windows系统服务,用以在系统时间到达时调用一个已编译好
的应用程序,这个程序放在远程机器上,但是不知为何,其并没有调用成功.(无论是用方
法1还是方法2都不成功!!)
请问是什么原因造成的呢?调用本地程序是可以正确执行的,是不是在服务程序里不可以
调用远程机器上的应用程序呢?
以下为程序中的调用代码,V:为一映像盘:
void __fastcall TFmMain::RunProg(AnsiString ExePath)
{
    char cm[120];
    sprintf(cm, "V:\user\kaiser\test\Prog.exe /Skaiser /Dzdata /P /N /L:1");

//-----------方法1-----------
    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    ZeroMemory( &si, sizeof(si) );
    si.cb = sizeof(si);
    ZeroMemory( &pi, sizeof(pi) );

    // Start the child process.
    if( !CreateProcess( NULL, // No module name (use command line).
        cm,               // Command line.
        NULL,             // Process handle not inheritable.
        NULL,             // Thread handle not inheritable.
        FALSE,            // Set handle inheritance to FALSE.
        0,                // No creation flags.
        NULL,             // Use parent's environment block.
        NULL,             // Use parent's starting directory.
        &si,              // Pointer to STARTUPINFO structure.
        &pi )             // Pointer to PROCESS_INFORMATION structure.
    )
    {
        LogWrite( "CreateProcess failed." );
    }

    // Wait until child process exits.
    WaitForSingleObject( pi.hProcess, INFINITE );

    // Close process and thread handles.
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );

   //-----------方法2-----------
    WinExec(cm, SW_HIDE);
}
//--------------------------------------------------------------------------
-