起動するだけのプログラム



ここんとこiPhoneは全然、開発進んでません。(^^;

仕事では、マックじゃなくて、Windows使ってるんでねぇ。

仕事帰りでも開発できるように、ノートでもほしいんだけどお金が・・・・

皆さん仕事くださーい、あっ、iPhoneのソフト購入してください(笑


つうことで今回はWindowsのソースの公開をしときます。

仕事で使おうかと思い、遊びで作ったソフトなんですけど、

テストもほとんどしてないんでバグは潜んでるとは思いますが、

公開します。


単に、シェル起動用プログラムです。

「SetUp.inf」の行ごとに起動していくプログラムです。

インストーラファイルとか作るのに便利でしょ。

バッチ処理でバッチファイルやスクリプトだと見栄えが悪いんでね。


数年ぶりにVC++で1〜2時間で作ったもんですし、かなり適当です。

理論上は、抜けてるなーと思うんですが、

XPで「SetUp.inf」をメモ帳で


calc.exe
wscript.exe .\\Install.wsf
cmd

っというのを作って流したのですが、

一つ一つが終了するまで、ちゃんと

止まってくれたので、問題ないでしょう。(笑



/* プリプロセッサ */
#include <windows.h> // WindowsAPI/
#include <tchar.h> // _T( )用
#include <stdio.h> // ファイル読み込み関連
#include <stdlib.h> // exit( ) 用
#include <string.h> // strlen( )用
#include <locale.h> // ワイド文字の言語指定用

// マクロ定義
#define READ_FILE_NAME "SetUp.inf" // 起動書類ファイル名
#define STR_MAX 256 // 文字列入力用配列長
#define MESSAGE_MAX 50

// プロトタイプ宣言
int execFunc(char *targetExe);


// 実行部
int WINAPI WinMain(
HINSTANCE hInstance ,
HINSTANCE hPrevInstance ,
LPSTR lpComdLine,
int nShowCmd)
{
FILE *fp; // ファイルポインタ用
char buff[STR_MAX]; // 文字列用
char errMessage[STR_MAX + MESSAGE_MAX ]; //エラーメッセージ生成用
int count =0; // 行カウント
TCHAR buf[STR_MAX]; // メッセージボックス用
size_t retSize=0; // mbstowcs_sの変換後の文字数取得用
errno_t err;

char path[1024];

// マルチバイトの言語(日本語)指定
setlocale( LC_CTYPE, "jpn" );

// ファイルオープン
if(err = fopen_s(&fp,READ_FILE_NAME, "r") !=0 )
{
// ファイルがオープンできなかった場合
MessageBox(NULL,_T("ファイルがオープンできません"),_T("エラー"),MB_OK);
exit(1); // 強制終了
}

while(fgets(buff, STR_MAX, fp) != NULL){
count ++;
if ( buff[strlen(buff) - 1] == '\n')
buff[strlen(buff) - 1] = '\0'; // 余分な改行コードを削除

// コマンド文字列の実行
if (execFunc (buff) == -1)
{
// 文字列の生成
sprintf_s(errMessage, STR_MAX + MESSAGE_MAX ,"[%s]が起動できません:(行数:%d)", buff ,count);
// char型→TCHAR型 に変換
mbstowcs_s(&retSize,buf,(sizeof buf)/2,errMessage,_TRUNCATE);
MessageBox(NULL,buf,_T("エラー"),MB_OK);
}
}
fclose(fp); // ファイルクローズ

return 0;
}

/* プログラム実行 */
// 第1引数 コマンドラインの文字列
// 戻り値 失敗:-1 成功:それ以外
int execFunc(char *targetExe)
{

int uRtn=0; // 戻り値

STARTUPINFO si; // スタートアップ情報
PROCESS_INFORMATION pi; // プロセス情報
TCHAR buf[STR_MAX]; // char型→TCHAR型 に変換
size_t retSize=0; // mbstowcs_sの変換後の文字数取得用

// 初期化
ZeroMemory(&si,sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi,sizeof(pi));

// char型→TCHAR型 に変換
mbstowcs_s(&retSize,buf,(sizeof buf)/2,targetExe,_TRUNCATE);

// プログラム(SHELL)の実行
if( !CreateProcess( NULL, // 実行可能モジュールの名前
buf , // コマンドラインの文字列
NULL , // セキュリティ記述子
NULL , // セキュリティ記述子
FALSE, // ハンドルの継承オプション
0, // 作成のフラグ
NULL , // 新しい環境ブロック
NULL , // カレントディレクトリの名前
&si, // スタートアップ情報
&pi // プロセス情報
)
)
{
uRtn = -1;
}

// プログラムが終わるまで待つ
WaitForSingleObject(pi.hProcess,INFINITE);

// 取得ハンドルの開放
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);

return uRtn;
}