2

win32 apiを使用して、C ++で次のbatファイルを実行しようとしています.Followingは実行用のコードです。

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

[編集済み] この実用的な提案は Chris からのものです:

    //#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開始するか、「open」動詞でファイルCMD /Cを開始するレジストリ関連付けを利用します。.BAT

見る:

どうやらCMD.EXEを起動しようとしないので、関連付け.

表示されるエラー コードはERROR_NO_ASSOCIATION、「この操作で指定されたファイルにアプリケーションが関連付けられていません」です。ShellExecuteバッチファイルの内容ではなく、APIを指します。

SE_ERR_NOASSOC

指定されたファイル名拡張子に関連付けられたアプリケーションはありません。このエラーは、印刷できないファイルを印刷しようとした場合にも返されます。

これは、ShellExecuteがあなたの主張を理解できなかったことを意味します。ファイルは 2 番目ではなく 3 番目に移動する必要があり、2 番目の引数は「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 に答える