2010年1月4日月曜日

コマンドライン引数の取得について

実行形式には
IMAGE_SUBSYSTEM_UNKNOWN 未知のサブシステム
IMAGE_SUBSYSTEM_NATIVE デバイスドライバとからしい
IMAGE_SUBSYSTEM_WINDOWS_GUI GUI
IMAGE_SUBSYSTEM_WINDOWS_CUI CUI
IMAGE_SUBSYSTEM_POSIX_CUI PosixのCUI(?)
IMAGE_SUBSYSTEM_WINDOWS_CE_GUI Windows CEのGUI

があるわけですが 

まぁ

EXEはコマンドライン引数を取得することができます。

C言語では

CUI

int main(int argc,char *argv[])
{
return 0;
}

GUI

int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine, //コマンドライン文字列
int nCmdShow
) {
return 0;
}

とまぁ なっているわけですよね

メイン関数の引数としてコマンドライン引数が取得できるわけなんですが、

ただメイン関数の引数は 普通の関数の引数とは仕組みがちょいと違うんですわな(たぶん)

普通の関数はスタックに積まれているデータを引数として使うんですが、

メインの引数はスタックにあるわけでなくてちょっと違った場所にあるらしい、、、

MS-DOS時代は PSP(program segment prefix)というとこにあったらしい。

Win32ではどのようになっているのか良くわからなかったのだが、PSPはまだ健在らしい・・・?
http://yasu.asuka.net/docs/tsr/
ここによると健在のような。。。

私が持っている書籍によると(高級言語プログラマのためのアセンブラ入門 ソフトバンククリエイティブ株式会社 http://www.amazon.co.jp/%E9%AB%98%E7%B4%9A%E8%A8%80%E8%AA%9E%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%82%A2%E3%82%BB%E3%83%B3%E3%83%96%E3%83%A9%E5%85%A5%E9%96%80-%E6%9E%97-%E6%99%B4%E6%AF%94%E5%8F%A4/dp/4797332816   p424~425)

起動直後のDSレジスタにPSPの領域の先頭アドレスがあるとかないとか。。。

GetCommandLine()という関数で取得も可能なのだが。。。

まぁ要するに アセンブラレベルで CUI GUI ともに コマンドラインとかインスタンスとか取得するにはどうすればいいのかーー!! と格闘してます っよっと

0 件のコメント: