Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在项目中嵌入bat文件?_C++_Batch File_Winapi_C++ Cli - Fatal编程技术网

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

C++ 如何在项目中嵌入bat文件?,c++,batch-file,winapi,c++-cli,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

我一直在使用下面的代码来启动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);

}
private:System::Void按钮1\u单击(系统::对象^sender,系统::事件参数^e){
std::wstring env=GetEnvString();
环境+=L“myvar=boo”;
env.push_back('\0');//嵌入空终止符有点笨拙
STARTUPINFO si={sizeof(STARTUPINFO)};
处理信息;
wchar\u t cmdline[]=L“cmd.exe/C:\\Users\\jrowler\\Desktop\\test\\startsimulator.bat”;
如果(!CreateProcess(NULL,cmdline,NULL,NULL,false,CREATE\u UNICODE\u环境,
(LPVOID)env.c_str(),NULL,&si,&pi))
{

STD::CUT> P>你可以用<代码>写文件> /CODE写文件。因为你使用C++,你可以避开我在代码中使用的<代码> <代码>函数(我习惯于C),并构建一个包含代码字符串操作的文件路径的<>代码> STD::WString ,然后使用<代码> CyString()
方法将第一个参数传递给
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文件保存为字节数组(或字符串),将其写入临时文件夹,然后将其命名为…?可能与和重复。哪个函数?我不太习惯C,我不确定我在看什么。
StringCchPrintfW
。将
FILE\u FLAG\u DELETE\u ON\u CLOSE
传递到可能是一个很好的措施,可以在应用程序崩溃或强制关闭时将其清除。使用用户的
%TEMP%
目录存储临时文件也是一个好主意。@IInspectable注意到,另外,我确实使用用户的
%TEMP%
目录抱歉,这意味着在
%TEMP%
目录中编写一个唯一的文件名,例如使用。