我尝试使用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。
答案 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;
}