如何在我的项目中嵌入 bat 文件?
How can I embed a bat file in my project?
我一直在使用以下代码来启动一个 bat 脚本。
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
std::wstring env = GetEnvString();
env += L"myvar=boo";
env.push_back('[=10=]'); // 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 并确保它位于正确的位置。
您可以使用 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
我一直在使用以下代码来启动一个 bat 脚本。
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
std::wstring env = GetEnvString();
env += L"myvar=boo";
env.push_back('[=10=]'); // 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 并确保它位于正确的位置。
您可以使用 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