#include "stdafx.h"
#include "ExtCmdRunner.h"

#include <shlobj.h>
#include <shlwapi.h>
#include <objbase.h>



void ExtCmdRunner::Execute(ShellExecMode mode)
{
	std::string s_ext = cmd.toLocal8Bit().data();
	std::string s_args = args.toLocal8Bit().data();

	SHELLEXECUTEINFOA info;
	info.cbSize = sizeof(SHELLEXECUTEINFOA);
	info.fMask = NULL;
	info.hwnd = NULL;
	info.lpVerb = NULL;
	info.lpFile = s_ext.c_str();
	info.lpParameters = s_args.c_str();
	info.lpDirectory = NULL;
	info.nShow = SW_HIDE;
	info.hInstApp = NULL;

	ShellExecuteExA(&info);
	if (mode == ShellExecMode::Wait)
		WaitForSingleObject(info.hProcess, INFINITE);
}

void ExtCmdRunner::Execute2(ShellExecMode mode)
{
	STARTUPINFOA si;// スタートアップ情報
	PROCESS_INFORMATION pi;// プロセス情報

	//STARTUPINFO 構造体の内容を取得 
	GetStartupInfoA(&si);

	QString cmd_full = "";
	cmd_full += cmd;
	cmd_full += " ";
	cmd_full += args;

	CreateProcessA(
		NULL,
		cmd_full.toLocal8Bit().data(),
		NULL,
		NULL,
		FALSE,
		CREATE_NO_WINDOW,				// 作成のフラグ 
		//CREATE_NEW_PROCESS_GROUP	: 新たなプロセス
		//CREATE_NEW_CONSOLE		: 新しいコンソールで実行
		//CREATE_NO_WINDOW			: コンソールウィンドウなしでアプリケーションを実行
		NULL,					// 新しい環境ブロック
		NULL,					// カレントディレクトリの名前
		&si,					// スタートアップ情報
		&pi					// プロセス情報
		);

	if (mode == ShellExecMode::Wait)
	{
		CloseHandle(pi.hThread);
		WaitForSingleObject(pi.hProcess, INFINITE);
		CloseHandle(pi.hProcess);
	}
}
