2013-05-18 114 views
2

我試圖在C++中使用win32 api執行以下bat文件。以下是執行代碼。ShellExecute()不能與.bat文件一起工作

//#include "Shellapi.h" 
    #include "Windows.h" 
    int _tmain(int argc, _TCHAR* argv[]) 
    { 
     ShellExecute(GetDesktopWindow(), "sa.bat","", NULL, NULL, SW_SHOWNORMAL); 
     DWORD LastError = GetLastError(); 
     return 0; 
    } 

但它不工作。

以下是內容 「sa.bat」

C:\ WINDOWS \ SYSTEM32 \ WUSA /卸載/ KB:2718695 /寧靜/ forcerestart

但最後一個錯誤返回1155

+1

比較你的論點:http://msdn.microsoft。com/en-ca/library/windows/desktop/bb762153(v = vs.85).aspx – chris

+0

你弄錯了參數,「sa.bat」應該作爲** third **參數傳遞。 –

+0

@HansPassant沒有它的不是:-(我的東西所以一些錯誤的批處理command.Did你的東西所以??請問我的新問題 – Aryan

回答

7

試試這個:

//#include "Shellapi.h" 
#include "Windows.h" 
int _tmain(int argc, _TCHAR* argv[]) 
{ 
    HINSTANCE hReturnCode=ShellExecute(NULL, _T("open"), _T("cmd.exe"), _T("/C sa.bat"), NULL, SW_SHOWNORMAL); 
    DWORD LastError = GetLastError(); 
    return 0; 
} 

將帖子 該工作的建議是從克里斯:

//#include "Shellapi.h" 
    #include "Windows.h" 
    int _tmain(int argc, _TCHAR* argv[]) 
    { 
     HINSTANCE hReturnCode=ShellExecute(NULL, _T("open"), _T("sa.bat"), NULL, NULL, SW_SHOWNORMAL); 
     DWORD LastError = GetLastError(); 
     return 0; 
    } 
+2

批處理文件應該作爲第三個參數,不應該嗎?使用它們代替其他地方的可執行文件。 – chris

+0

@cris:顯然意味着Roman R.不是這樣;) – duDE

+0

好吧,我剛剛測試過它,它確實運行我的批處理文件,而不通過cmd進行路由。 – chris

2

.BAT文件不是可執行的二進制文件,所以批處理文件本身並不能起飛,而是它開始命令解釋器(CMD.EXE)。在ShellExecute上,您可以直接使用CMD /C開始它,也可以利用註冊表分配,這會啓動帶有「打開」動詞的.BAT文件。

參見:

你顯然不嘗試啓動CMD.EXE,這樣的關聯。

您得到的錯誤代碼是ERROR_NO_ASSOCIATION「沒有應用程序與此操作的指定文件相關聯。」它指的是ShellExecute API,而不是指向批處理文件的內容。

SE_ERR_NOASSOC

沒有與給定文件擴展名關聯的應用程序。如果您嘗試打印不可打印的文件,也會返回此錯誤。

這意味着ShellExecute無法找出您的論點。該文件應該是第三個,而不是第二個,然後第二個參數將是「打開」或NULL(動詞)。將動詞應用於.BAT文件將使.BAT文件「運行」。

+0

.bat文件本身可能不是二進制可執行文件,但它們可以通過ShellExecute/Ex()直接執行,因爲它們與註冊表中的cmd.exe相關聯。您鏈接到的兩篇文章都使用cmd.exe,因爲它們利用了需要它的額外功能。 –

+0

@RemyLebeau:我澄清說。 –

0

ShellExecute()通過自己的返回值報告錯誤,而不是通過GetLastError()報告錯誤。您還需要傳遞參數lpFile中的文件名,而不是參數lpOperation

試試這個:

//#include "Shellapi.h" 
#include "Windows.h" 
int _tmain(int argc, _TCHAR* argv[]) 
{ 
    int nErrorCode = (int) ShellExecute(NULL, NULL, "sa.bat", NULL, NULL, SW_SHOWNORMAL); 
    if (nErrorCode <= 32) 
     // an error occurred... 
    return 0; 
} 
1

這也將工作:

#include <windows.h> 
#include <stdio.h> 
int main() 
{ 
    STARTUPINFO si; 
    PROCESS_INFORMATION pi; 

    ZeroMemory(&si, sizeof(si)); 
    si.cb = sizeof(si); 
    ZeroMemory(&pi, sizeof(pi)); 
    if(!CreateProcess(NULL, "cmd /C sa.bat", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi) ) 
    { 
    printf("CreateProcess failed (%d)\n", GetLastError()); 
    return FALSE; 
    } 
    WaitForSingleObject(pi.hProcess, INFINITE); 
    CloseHandle(pi.hProcess); 
    CloseHandle(pi.hThread); 
    return 0; 
}