如何在项目中嵌入bat文件?

时间:2017-01-31 13:55:39

标签: c++ batch-file winapi c++-cli

我一直在使用以下代码来启动bat脚本。

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {

    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 C:\\Users\\jrowler\\Desktop\\test\\startsimulator.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);

}

这实际上是完美的,但我想知道是否有可能采取该bat文件并以某种方式将其包含在我的项目中?最终这个项目将分发给几个不同的人,我希望它能够以这样的方式设置,即它不需要用户单独下载.bat并确保它保持在正确的位置。

1 个答案:

答案 0 :(得分:1)

您可以使用WriteFile写出文件。既然你正在使用C ++,你可以避免我在我的代码中使用的<strsafe.h>函数(我已经习惯了C)并使用标准字符串操作构建一个包含文件路径的std::wstring,然后使用c_str()方法将第一个参数传递给CreateFile

char batContent[] = "@echo off\r\necho Hello World\r\n";
wchar_t temp[MAX_PATH], path[MAX_PATH];
GetEnvironmentVariableW(L"Temp", temp, MAX_PATH);
int len = strlen(batContent);
DWORD dwWritten;
StringCchPrintfW(path, MAX_PATH, L"%s\\filename.bat", temp);
HANDLE hFile = CreateFileW(path, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
if(hFile == INVALID_HANDLE_VALUE)
{
      // handle error
}

WriteFile(hFile, batContent, len, &dwWritten, NULL);
CloseHandle(hFile);

// Call CreateProcess with your existing code