2017-04-21 5 views
1

私はresouceプロジェクトにバッチファイルを埋め込みます。コンソールでバッチスクリプトを実行します。バッチスクリプトファイルを埋め込み、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ファイルを保存する場合実行ファイルから実際のバットファイルを取得するには、FindResource/LoadResource/LockResourceを使用できます。このような何か:

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::systemまたはpopen

+0

感謝の男が、埋め込みリソースのいずれかの方法を使用してそれを実行することができますか? –

+0

埋め込みリソースを取得して、ファイルに保存してから(ある一時的な場所に)、システムまたはpopenを使用してそのbatファイルを実行する必要があります。あるいは、一時ファイルを使用したくない場合は、リソースからデータを読み込み、 'cmd/c param1 param2 ...'文字列を作成して、システムを使って実行する必要があります。 – Pavel

+0

は、サンプルコード –

関連する問題