2017-01-31 2 views
0

Ive использовал следующий код, чтобы запустить скрипт bat.Как вставить файл 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 как массив байтов (или строку), записать его в папку temp, а затем вызвать его ...? – npocmaka

+1

Возможный дубликат [Как загрузить пользовательский двоичный ресурс в статической библиотеке VC++ как часть DLL?] (Http://stackoverflow.com/questions/9240188/how-to-load-a-custom-binary-resource -in-a-vc-static-library-as-part-of-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

Смежные вопросы