2017-01-31 6 views
0

次のコードを使用して、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を別々にダウンロードして、正しい場所に留まることを要求しないように設定したいと思います。

+2

リソースとして含め、必要に応じてディスクに書き込みます。 –

+0

batファイルをバイト配列(または文字列)として保存し、一時フォルダーに書き込み、それを呼び出すことができます...? – npocmaka

+1

[DLLの一部としてVC++静的ライブラリにカスタムバイナリリソースをロードする方法は?](http://stackoverflow.com/questions/9240188/how-to-load-a-custom-binary-resource) -in-a-vc-static-library-d-a-dllの一部として)と[ネイティブWindowsアプリケーションのリソースにテキストファイルを埋め込む](http://stackoverflow.com/q/2933295/1889329) 。 – IInspectable

答えて

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 
+0

は機能しますか?私は本当にCに慣れていない、私は何を見ているのかわからない。 –

+0

'StringCchPrintfW'。 –

+1

[FILE_FLAG_DELETE_ON_CLOSE]を[CreateFile](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858.aspx)に渡すことは、おそらくアプリケーションの場合でもクリーンアップするための良い措置ですクラッシュするか、強制的に閉じます。ユーザーの '%TEMP%'ディレクトリを使用することも、一時ファイルを保存することをお勧めします。 – IInspectable

関連する問題