gpt4 book ai didi

c++ - 嵌入批处理脚本文件并在 C++ 控制台项目中运行

转载 作者:太空宇宙 更新时间:2023-11-04 13:02:45 25 4
gpt4 key购买 nike

我将在资源项目中嵌入批处理文件,我想在控制台中运行批处理脚本。

如何运行嵌入脚本

#include "stdafx.h"
#include "iostream"
#include "conio.h"
#define WINDOWS_LEAN_AND_MEAN
#include <Windows.h>

std::wstring GetEnvString()
{
wchar_t* env = GetEnvironmentStrings();
if (!env)
abort();
const wchar_t* var = env;
size_t totallen = 0;
size_t len;
while ((len = wcslen(var)) > 0)
{
totallen += len + 1;
var += len + 1;
}
std::wstring result(env, totallen);
FreeEnvironmentStrings(env);
return result;
}

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{

std::wstring env = GetEnvString();
env += L"myvar=boo";
env.push_back('\0'); // somewhat awkward way to embed a null-terminator

STARTUPINFO si = { sizeof(STARTUPINFO) };
PROCESS_INFORMATION pi;

wchar_t cmdline[] = L"cmd.exe /C f.bat";

if (!CreateProcess(NULL, cmdline, NULL, NULL, false, CREATE_UNICODE_ENVIRONMENT,
(LPVOID)env.c_str(), NULL, &si, &pi))
{
std::cout << GetLastError();
abort();
}

CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);

getch();
}

embed batch script file in c++ console

这是我要从资源项目运行的位置批处理文件

 wchar_t cmdline[] = L"cmd.exe /C f.bat";

最佳答案

你可以使用std::system :

#include <fstream>
#include <cstdlib>

int main()
{
std::ofstream fl("test.bat");
fl << "@echo off\n"
"echo testing batch.\n"
"cd c:\\windows\n"
"dir";
fl.close();
system("test.bat");
}

然而,对于系统,您可以简单地执行命令,而无法获得它们的输出。要获得输出,您可以将 .bat 的输出重定向到一个文件,或者您可以使用 popen你可以像普通文件一样读取输出。请注意,popen 只为您提供 stdout,但您可以将 stderr 重定向到 stdout:

#include <cstdlib>
#include <cstdio>

int main()
{
FILE *p = _popen("missing_executable.exe 2>&1", "r");
if (p)
{
char data[1024];
int n = 0;
while (fgets(data, 1024, p))
printf("%02d: %s", ++n, data);
int ret = _pclose(p);
printf("process return: %d\n", ret);
}
else
{
printf("failed to popen\n");
}
}

这是输出:

01: 'missing_executable.exe' is not recognized as an internal or external command,
02: operable program or batch file.
process return: 1
Press any key to continue . . .

如果您想将 .bat 文件作为资源存储在 Windows 可执行文件中,您可以使用 FindResource/LoadResource/LockResource从您的可执行文件中获取实际的 bat 文件。像这样:

HMODULE module = GetModuleHandle(NULL);
// update with your RESOURCE_ID and RESOURCE_TYPE.
HRSRC res = FindResource(module, MAKEINTRESOURCE(RESOURCE_ID), RESOURCE_TYPE);
HGLOBAL resMem = LoadResource(module, res);
DWORD resSize = SizeofResource(module, res);
LPVOID resPtr = LockResource(resMem);

char *bytes = new char[resSize];
memcpy(bytes, resPtr, resSize);

现在您可以将字节保存到文件中并使用std::system 执行它或 popen

关于c++ - 嵌入批处理脚本文件并在 C++ 控制台项目中运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43536376/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com