API-7 WinMainをD&Dで起動

WinMain関数の第3引数はコマンドライン引数です。
ただし、main関数のように引数の数(argc)とそれぞれの引数(argv)のように分けられず、渡された引数全てがひとつの文字列として代入されています。
また、実行ファイル自信のパスは含まれていません。

GetCommandLine関数を使えば、渡された引数だけでなく自身のパスも得ることができます。
でも、こっちもひとつの文字列として。
http://www.wisdomsoft.jp/dev/api/windows/005

それぞれの引数はダブルクォーテーションとスペースで分けられているので、自分で分解する必要があります。
[技術者向] コンピューター > プログラミング > C&C++ ">http://oshiete1.goo.ne.jp/qa2889140.html

main関数みたいにできないかと探してみたところ、__argcと__argvを使えば、main関数と同じように引数を使うことができるみたいです。
ただし、コンパイラに依存してしまうみたいです。
http://win32lab.com/tips/tips3.html


WinMainでもmainでも、ファイル名が長いとダブルクォーテーションが追加されないようです。
そのとき、ファイル名に半角スペースが含まれていると、スペースで分けられてそれぞれ別の引数としてargvに代入されてしまうみたいです。

サンプル
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
// Borland C++ Compiler 5.5 にてコンパイル

#include <windows.h>

int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst,
                        LPSTR lpsCmdLine, int nCmdShow)
{
        TCHAR    ss[256];
        INT        i;
        
        MessageBox(NULL,lpsCmdLine,TEXT("lpsCmdLine"),MB_OK);
        MessageBox(NULL,GetCommandLine(),TEXT("GetCommandLine"),MB_OK);
        wsprintf(ss,"%d",__argc);
        MessageBox(NULL,ss,TEXT("__argc"),MB_OK);
        for(i=0; i<__argc; i++)
        {
        wsprintf(ss,"%d\n%s",i,__argv[i]);
        MessageBox(NULL,ss,TEXT("__argv"),MB_OK);
        }
        return 0;
}

0 件のコメント:

コメントを投稿