スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

クリエイトプロセス

カタカナでクリエイトプロセスと記述すると、胡散臭い業者名っぽいですが、
英語で書くと CreateProcess となりまして、年季の入ったIT屋であれば一度は目にしたことがある?
かもしれない、いわゆるWindowsのAPI関数名となります。
UnixやLinuxでは、fork() と言われている、プロセスを新たに作成するこの機能ですが、
じつは、Windows等のOSは、プロセスをポコポコ大量に産みまくる仕組みで出来ており、
たくさんのプロセスが協力し合いながら動いています。
アイコンをクリックしてアプリを起動しても、プロセスが産まれます。
このプロセスを産ませる為の命令が、このCreateProcessなのですね。
まぁ産むとか産ませるとか書くと、なんかエロゲーちっくかもしれませんが
べつに産ませるために行為などは必要なくって、


bRet = CreateProcess(
NULL,//(LPCTSTR)appName,//LPCTSTR lpApplicationName, // 実行可能モジュールの名前
szCmd,//lpCommandLine, // コマンドラインの文字列
NULL,//LPSECURITY_ATTRIBUTES lpProcessAttributes, // セキュリティ記述子
NULL,//LPSECURITY_ATTRIBUTES lpThreadAttributes, // セキュリティ記述子
FALSE,//BOOL bInheritHandles, // ハンドルの継承オプション
dwCreationFlags, // 作成のフラグ
NULL,//LPVOID lpEnvironment, // 新しい環境ブロック
NULL,//LPCTSTR lpCurrentDirectory, // カレントディレクトリの名前
&stStartupInfo, // スタートアップ情報
&ProcessInformation // プロセス情報
);


こんな感じでCreateProcess命令をC言語ソースに記述すればいいんです。





と私は思っていたのですが、
上記サンプルコードでの「szCmd」ですが、ここがくせ者でした。
Unicode対応させるためにWCHARなどを使う場合、
strcpyなどを使ってこのszCmdを用意すると、CreateProcessでプロセスが起動されません。
sprintfとか strcat とかもダメですし、
文字列をリテラルで記述してもダメだったと思います。

んでは、どうすれば良いのか?

よくあるコマンドラインからの取り込みを想定しますと、

まず、メイン関数の記述は、

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

という形で、 _TCHAR 型のポインタの配列を第二引数にとらせます。

つぎにコマンドラインの取り込みですが、ここは普通に argv[1]などでいいです。
ただし、コマンドラインの文字列をコピーする先の文字変数は、
wchar_t 型などで宣言してください。
wchar_t lpCommandLine[256];
等の感じで。

エクスプローラーを呼び出す文字列をとりあえず作ってみます。


TCHAR szCmd2[] = TEXT("EXPLORER.EXE");
TCHAR szCmd[1024];
_tcscpy(szCmd,szCmd2);
_tcscat(szCmd,TEXT(" /E,/SELECT,\""));
_tcscat(szCmd,argv[1]);
_tcscat(szCmd,TEXT("\""));


汚いコードですが、判りやすいのでは?
リテラルは、TEXT(でくくります。
文字列の連結とかは、 _tcscpy や _tcscat を使います。
これでszCmd変数の中身が正しく準備されるわけですね。
Wide文字対応できた、ということで。
stStartupInfoとかは、
.cb=sizeof(で大きさを指定し、
.dwFlags=STARTF_USESHOWWINDOW;
.wShowWindow=SW_SHOW;
等としておきます・・・あ、そのまえに
SecureZeroMemory(&stStartupInfo,sizeof(stStartupInfo));
SecureZeroMemory(&ProcessInformation,sizeof(ProcessInformation));
としてメモリを初期化しておくのはわすれないでね…

これで、ちょいちょいとした細かいユーティリティプログラムを作るときのWIDE文字対応、Unicode対応としてやりやすくなるのではないでしょうか?
スポンサーサイト

この記事のトラックバックURL

http://alphaiota.blog105.fc2.com/tb.php/470-caf07373

コメント

コメントする

管理者にだけ表示を許可する

Template Designed by DW99

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。