2017-04-21 57 views
1

我將嵌入批處理文件資源項目,我想在控制檯中運行批處理腳本。嵌入批處理腳本文件並運行在C++控制檯項目

如何運行嵌入腳本

#include "stdafx.h" 
#include "iostream" 
#include "conio.h" 
#define WINDOWS_LEAN_AND_MEAN 
#include <Windows.h> 

std::wstring GetEnvString() 
{ 
    wchar_t* env = GetEnvironmentStrings(); 
    if (!env) 
     abort(); 
    const wchar_t* var = env; 
    size_t totallen = 0; 
    size_t len; 
    while ((len = wcslen(var)) > 0) 
    { 
     totallen += len + 1; 
     var += len + 1; 
    } 
    std::wstring result(env, totallen); 
    FreeEnvironmentStrings(env); 
    return result; 
} 

using namespace std; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 

    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 f.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); 

    getch(); 
} 

embed batch script file in c++ console

這個位置批處理文件,我想從資源項目運行

wchar_t cmdline[] = L"cmd.exe /C f.bat"; 

回答

0

您可以使用std::system

#include <fstream> 
#include <cstdlib> 

int main() 
{ 
    std::ofstream fl("test.bat"); 
    fl << "@echo off\n" 
      "echo testing batch.\n" 
      "cd c:\\windows\n" 
      "dir"; 
    fl.close(); 
    system("test.bat"); 
} 

但是,您可以簡單地執行命令,但無法獲得輸出。要獲得輸出,您可以將.bat的輸出重定向到一個文件,或者您可以使用popen,並且可以像常規文件一樣讀取輸出。需要注意的是POPEN讓你只標準輸出,但你可能會重定向錯誤輸出到標準輸出:

#include <cstdlib> 
#include <cstdio> 

int main() 
{ 
    FILE *p = _popen("missing_executable.exe 2>&1", "r"); 
    if (p) 
    { 
     char data[1024]; 
     int n = 0; 
     while (fgets(data, 1024, p)) 
      printf("%02d: %s", ++n, data); 
     int ret = _pclose(p); 
     printf("process return: %d\n", ret); 
    } 
    else 
    { 
     printf("failed to popen\n"); 
    } 
} 

下面是輸出:

01: 'missing_executable.exe' is not recognized as an internal or external command, 
02: operable program or batch file. 
process return: 1 
Press any key to continue . . . 

如果你想你的.bat文件存儲作爲一種資源在Windows可執行文件,你可以使用FindResource/LoadResource/LockResource從您的可執行文件中獲取實際的bat文件。事情是這樣的:

HMODULE module = GetModuleHandle(NULL); 
// update with your RESOURCE_ID and RESOURCE_TYPE. 
HRSRC res = FindResource(module, MAKEINTRESOURCE(RESOURCE_ID), RESOURCE_TYPE); 
HGLOBAL resMem = LoadResource(module, res); 
DWORD resSize = SizeofResource(module, res); 
LPVOID resPtr = LockResource(resMem); 

char *bytes = new char[resSize]; 
memcpy(bytes, resPtr, resSize); 

現在你可以字節保存到一個文件,並使用std::systempopen

+0

感謝的人,但任何方式嵌入資源執行呢? –

+0

您需要獲取嵌入式資源並將其保存到文件中(到某個臨時位置),然後使用系統或popen執行該bat文件。或者如果你不想使用臨時文件,你需要從你的資源中讀取數據並創建一些'cmd/c param1 param2 ...'字符串,這個字符串可以使用系統來執行。 – Pavel

+0

可以顯示示例代碼 –

相關問題