我有一个win32程序,它用给定的CommandLineToArgvW
调用lpCmdLine
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
(void)hInstance;
(void)hPrevInstance;
(void)nCmdShow;
int argc;
LPTSTR* argv = CommandLineToArgvW(lpCmdLine, &argc);
MessageBoxW(0, lpCmdLine, TEXT("lpCmdLine"), MB_OK );
for(int i=0; i<argc;++i){
MessageBoxW(0, argv[i], TEXT("argv"), MB_OK );
}
return 0;
}
我观察到的奇怪的事情是:
lpCmdLine
是一个空字符串,而CommandLineToArgvW
返回1个参数-可执行路径。CommandLineToArgvW
将返回确切数量的参数,而不包含可执行文件我找不到记录的这种奇怪行为。
我想念什么?我是否会意外使用该命令?
答案 0 :(得分:2)
printf
类型:
lpCmdLine
指向包含完整命令行的以空终止的Unicode字符串的指针。 如果此参数为空字符串,函数将返回当前可执行文件的路径。
这意味着LPCWSTR
仅在CommandLineToArgvW()
参数为null或明确地包含可执行文件名称的情况下才返回调用可执行文件的名称。
请注意,lpCmdLine
需要完整的命令行。但是,根据WinMain()
:
CommandLineToArgvW()
类型:
lpCmdLine
应用程序的命令行,不包括程序名称。要检索整个命令行,请使用
GetCommandLine
函数。
因此,当您执行不带参数的程序时,LPSTR
的{{1}}参数为空白,而WinMain
仅返回可执行文件名称。但是,如果使用参数执行程序,则lpCmdLine
参数不是空白,但不包含可执行文件名称,因此CommandLineToArgvW()
仅返回没有可执行文件名称的参数。
这样,您需要按照lpCmdLine
文档的说明进行操作,并使用CommandLineToArgvW()
而不是WinMain()
。 GetCommandLine()
文档中也对此进行了说明:
GetCommandLineW
函数可用于获取适合用作lpCmdLine
参数的命令行字符串。
因此,请改用它:
CommandLineToArgvW()