2

我尝试使用 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

4 回答 4

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;
    }
于 2013-05-18T07:46:46.187 回答
3

.BAT文件不是可执行的二进制文件,因此单独的批处理文件不会起飞,而是使用命令解释器 (CMD.EXE) 启动。ShellExecute你要么CMD /C直接启动它,要么利用注册表关联,它以“打开”动词启动文件.BAT

看:

你显然没有尝试启动 CMD.EXE,所以关联。

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

SE_ERR_NOASSOC

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

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

于 2013-05-18T07:48:40.400 回答
2

这也将起作用:

#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;
}
于 2014-01-06T14:30:02.257 回答
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;
}
于 2013-05-19T07:19:07.017 回答