命令行参数wmain (int argc,wchar_t *argv[])

原文链接:https://my.oschina.net/u/160145/blog/264389

命令参数,总是把我搞得头晕,这回决定把它一次弄清
启动程序时,系统会在传入命令行参数给程序
比如下面,
ipconfig /all
 显示完整网络配置信息。
%windir%\system32\rundll32.exe powrprof.dll,SetSuspendState
这个在启用休眠的电脑上运行,立即进入休眠
同样
shutdown /h 
也能休眠
....
如下图所示
ttt是程序名,它和它后面的东西一起在启动程序时就传给了程序
一般的命令行程序就可以从argc,argv中取得所有的参数
但是如果是windows程序呢,下面就来讲

命令行参数wmain (int argc,wchar_t *argv[])

这是测试代码

//cl ttt.cpp
//ttt  The last  straw that breaks the camel's back
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <locale.h>//让wprintf()支持中文
#pragma comment(lib,"shell32.lib")
int wmain (int argc,wchar_t *argv[]) 
{
	setlocale(LC_CTYPE,"CHS");//让wprintf()支持中文
	wprintf(L"main (int argc,char *argv[])\n");

	wprintf(L"命令行中可执行文件名argv[0]为:%s",argv[0]); 
	wprintf(L"总共有argc:%d个参数:\n",argc); 
	for(int i=0;i<argc;i++)
	{
		wprintf(L"[%d]:%s\n",i,argv[i]);
	}
	
	int nargs;
	WCHAR *psz=GetCommandLineW();	
	wprintf(L"GetCommandLineW()返回:%s\n\n",psz);	
	wprintf(L"CommandLineToArgvW(GetCommandLineW(),&nargs):\n");

	WCHAR **pszcmdlist=CommandLineToArgvW(psz,&nargs);
	if(pszcmdlist!=NULL)
	{
		for(int i=0;i<nargs;i++)
		{
			wprintf(L"%d,%s\n",i,pszcmdlist[i]);
		}
		LocalFree(pszcmdlist);//记得释放
		pszcmdlist=NULL;
	}
}
如何取得完整路径的程序名呢?
如何取得程序路径?
还有程序的执行映像名呢?

找到了这几个API:GetModuleFileNameW()  GetCurrentDirectoryW() GetFileTitleW() 

命令行参数wmain (int argc,wchar_t *argv[])

完整的源代码
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <locale.h>//让wprintf()支持中文
#include <atlstr.h>
#pragma comment(lib,"shell32.lib")
#pragma comment(lib,"comdlg32.lib")

int wmain (int argc,wchar_t *argv[]) 
{
	setlocale(LC_CTYPE,"CHS");//让wprintf()支持中文
	wprintf(L"main (int argc,char *argv[])\n");

	wprintf(L"命令行中可执行文件名argv[0]为:%s",argv[0]); 
	wprintf(L"总共有argc:%d个参数:\n",argc); 
	for(int i=0;i<argc;i++)
	{
		wprintf(L"[%d]:%s\n",i,argv[i]);
	}
	
	int nargs;
	WCHAR *psz=GetCommandLineW();	
	wprintf(L"GetCommandLineW()返回:%s\n\n",psz);	
	wprintf(L"CommandLineToArgvW(GetCommandLineW(),&nargs):\n");

	WCHAR **pszcmdlist=CommandLineToArgvW(psz,&nargs);
	if(pszcmdlist!=NULL)
	{
		for(int i=0;i<nargs;i++)
		{
			wprintf(L"%d,%s\n",i,pszcmdlist[i]);
		}
		LocalFree(pszcmdlist);//记得释放
		pszcmdlist=NULL;
	}
	WCHAR AppFileFullName[MAX_PATH];
	GetModuleFileNameW(NULL,AppFileFullName,MAX_PATH);
	wprintf(L"完整路径的程序名:%s\n",AppFileFullName);
	WCHAR AppFileTitleName[MAX_PATH];
	GetFileTitleW(AppFileFullName,AppFileTitleName,sizeof(AppFileTitleName));
	wprintf(L"程序标题名:%s\n",AppFileTitleName);
	WCHAR AppDirectory[MAX_PATH];
	GetCurrentDirectoryW(sizeof(AppDirectory),AppDirectory);
	wprintf(L"程序路径:%s\n",AppDirectory);
}


转载于:https://my.oschina.net/u/160145/blog/264389

上一篇:c – QApplication app(argc,argv)


下一篇:C++学习笔记