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

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


这是测试代码

//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() 



完整的源代码
#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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: int _tmain(int argc, _TCHAR* argv[]) 是一个 C/C++ 程序的主函数,其中 _tmain 是在 Windows 系统上使用的主函数名称。参数 argc 表示命令行参数的数量,argv[] 是一个指针数组,用于存储命令行参数的字符串。主函数的返回值类型是 int,一般情况下,返回 0 表示程序正常结束,返回其他数值表示程序异常结束。 例如,下面是一个简单的 C++ 主函数: ``` int _tmain(int argc, _TCHAR* argv[]) { std::cout << "Hello, World!" << std::endl; return 0; } ``` ### 回答2: int _tmain(int argc, _TCHAR* argv[]) 是一个C++程序的入口函数。在C++中,main函数是程序的入口函数,它在程序运行时会被自动调用。而在使用了Unicode编码的Windows环境中,main函数会被替代为_tmain函数。_tmain函数的参数argc表示命令行参数的数量,_TCHAR* argv[]则是一个数组,用来存储命令行参数的值。 通常情况下,argc的值至少为1,因为第一个参数通常是程序的名称。而argv数组会依次存储命令行参数的值,每个参数之间以空格分隔。可以使用索引来访问特定的命令行参数,例如argv[0]表示程序的名称,argv[1]表示第一个命令行参数,依此类推。 而在使用了Unicode编码的Windows环境中,_TCHAR是一种宏,它可以根据编译选项的设置决定是指向char类型还是wchar_t类型的指针。这样可以在不同的编码环境中实现代码的兼容性。 综上所述,int _tmain(int argc, _TCHAR* argv[]) 是一个用来接收命令行参数的C++程序入口函数,在使用了Unicode编码的Windows环境中可以保证代码的兼容性。 ### 回答3: int _tmain(int argc, _TCHAR* argv[])是一个C/C++程序的入口函数。这个函数的目的是接收命令行参数以及运行程序。下面对参数进行解释: int argc:表示命令行参数的个数。在命令行运行程序时,操作系统会把程序名和其他参数作为参数传入。argc表示所有参数的数量。 _TCHAR* argv[]:是一个字符指针数组,其中每个元素都指向一个字符数组,表示各个命令行参数argv[0]指向程序的名称,即程序的可执行文件名。argv[1]指向第一个命令行参数argv[2]指向第二个命令行参数,以此类推。 在编写程序时,可以通过argcargv来获取命令行参数的值。通过argc可以判断命令行参数的个数,通过argv可以逐个获取命令行参数的值。这对于需要根据不同的输入值执行不同的操作的程序特别有用。 _tmain是一个宏定义,根据不同的编译环境,可以展开为main或wmainmain是用于处理字符数组参数的函数,而wmain是用于处理宽字符数组参数的函数。可以根据具体需要来选择是使用main还是wmain。 总之,int _tmain(int argc, _TCHAR* argv[])是一个程序的入口函数,用于接收并处理命令行参数

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值