ShellExecute()不使用.bat文件

时间:2013-05-18 07:42:25

标签: c++ winapi

我尝试使用win32 api在c ++中执行以下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 / uninstall / kb:2718695 / quiet / forcerestart

但最后一个错误返回1155。

4 个答案:

答案 0 :(得分: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;
}

[EDITED] 这个工作建议来自克里斯:

    //#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;
    }

答案 1 :(得分:2)

.BAT文件不是可执行的二进制文件,因此单独的批处理文件不会起飞,而是使用命令解释程序(CMD.EXE)启动。在ShellExecute上,您可以直接使用CMD /C启动它,也可以利用注册表分配来启动带有“打开”动词的.BAT文件。

请参阅:

您显然不会尝试启动CMD.EXE,因此关联。

您获得的错误代码是ERROR_NO_ASSOCIATION“没有应用程序与此操作的指定文件相关联。”它引用ShellExecute API,而不是批处理文件的内容。

  

SE_ERR_NOASSOC

     

没有与给定文件扩展名关联的应用程序。如果您尝试打印不可打印的文件,也会返回此错误。

这意味着ShellExecute无法弄清楚你的论点。该文件应该是第三个,而不是第二个,然后第二个参数将是“打开”或NULL(动词)。将动词应用到.BAT文件将使.BAT文件“运行”。

答案 2 :(得分:1)

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;
}

答案 3 :(得分: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;
}