teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

CommandLineToArgvWについて追記

2017/05/05 15:31

投稿

退会済みユーザー
answer CHANGED
@@ -12,4 +12,47 @@
12
12
  Visual Studioでプロジェクトを作ったらデフォルトでこの設定のはず。
13
13
 
14
14
  WinMain → wWinMain
15
- CreateFile → CreateFileW
15
+ CreateFile → CreateFileW
16
+
17
+ ---
18
+
19
+ 追記:
20
+
21
+ CommandLineToArgvWの使い方を知りたいみたいだったので追記。
22
+ Unicode対応だとわかりやすいようにWが付いた方のAPIを指定してます。
23
+
24
+ ```C++
25
+ #include <windows.h>
26
+
27
+ int WINAPI wWinMain(HINSTANCE, HINSTANCE, LPWSTR lpCmdLine, int)
28
+ {
29
+ int Argc; // コマンドライン引数の個数
30
+ LPWSTR *Argv; // コマンドライン引数のリスト
31
+ HANDLE hFile = nullptr;
32
+
33
+ // GetCommandLine()を使用した場合は、Argv[0]に実行時のパスが入り、
34
+ // Argv[1]以降にコマンドライン引数が入る
35
+ // lpCmdLineを指定した場合は、Argv[0]に1番目のコマンドライン引数が入る
36
+ Argv = CommandLineToArgvW(GetCommandLineW(), &Argc);
37
+ // Argv = CommandLineToArgvW(lpCmdLine, &Argc);
38
+
39
+ hFile = CreateFileW(Argv[1], GENERIC_READ, 0, nullptr, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, nullptr);
40
+ if (hFile == INVALID_HANDLE_VALUE) {
41
+ MessageBoxW(nullptr, L"ファイルのオープンに失敗しました", L"エラー", MB_OK);
42
+ return 1;
43
+ }
44
+
45
+ CloseHandle(hFile);
46
+
47
+ return 0;
48
+ }
49
+ ```
50
+
51
+ これで`>test.exe text1.txt text2.txt text3.txt`のような感じで、スペースで区切って複数のオプションを指定した場合、
52
+
53
+ Argv[0]にtest.exe
54
+ Argv[1]にtext1.txt
55
+ Argv[2]にtext2.txt ... というようにコマンドライン引数が格納され、
56
+
57
+ CreateFileにArgv[1]を指定しているので、text1.txtが作成され他は無視されるというわけです。
58
+