当前位置:   article > 正文

PE文件-C++-SetCurrentDirectory当前工作文件夹编辑-GetCommandLine函数获取当前命令行参数_setcurrentdirectorya

setcurrentdirectorya

1.SetCurrentDirectoryA函数

BOOL SetCurrentDirectory([in] LPCTSTR lpPathName);

设置当前应用程序新当前目录的路径。此参数可以指定相对路径或完整路径。无论哪种情况,都会计算指定目录的完整路径并将其存储为当前目录。
有关详细信息,请参阅文件名、路径和命名空间。
在此函数的 ANSI 版本中,名称仅限于MAX_PATH字符。
空字符之前的最后一个字符必须是反斜杠 (‘’)。如果您不指定反斜杠,则会为您添加;因此,请为路径指定MAX_PATH -2 个字符,除非包含尾部反斜杠,在这种情况下,请为路径指定MAX_PATH -1 个字符。
如果函数成功,则返回值非零。如果函数失败,则返回值为零。要获取扩展的错误信息,请调用 GetLastError。

  为了更好的规范当前程序的运行环境,可以设置当前工作目录。源代码如下所示:

#include "windows.h"
#include <stdio.h>
#include <tchar.h>
#include <string>
//设置当前目录为程序文件所在目录, 返回应用程序所在目录
static std::string SetWorkFolder()
{
	//1.查找本模块所在目录
	std::string workFolder;
	CHAR szMoudlePath[MAX_PATH] = { 0 };//使用NULL参数,获取本模块路径
	if (!GetModuleFileNameA(NULL, szMoudlePath, MAX_PATH))
	{
		printf("获取模块路径错误。\n");
		return workFolder;
	}

	//2.获取路径
	char _Drive[MAX_PATH] = { 0 };
	char _Dir[MAX_PATH] = { 0 }; 
	char _Filename[MAX_PATH] = { 0 }; 
	char _Ext[MAX_PATH] = { 0 };
	_splitpath(szMoudlePath, _Drive, _Dir, _Filename, _Ext);
	workFolder = _Drive;
	workFolder = workFolder + _Dir;

	//3.设为当前目录
	::SetCurrentDirectoryA(workFolder.c_str());
	return workFolder;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

2.GetCommandLine函数

LPSTR GetCommandLineA();

返回值的生命周期由系统管理,应用程序不应释放或修改该值。控制台进程可以通过将它们实现为程序入口点来使用main或wmain函数的argc和argv参数。GUI 进程可以通过将WinMain或 wWinMain 函数的lpCmdLine参数实现为程序入口点来使用它们。要将命令行转换为argv样式的字符串数组,请将结果从 GetCommandLineA 传递给 CommandLineToArgW。
返回值是指向当前进程的命令行字符串的指针。

  如果,修改第三方程序,需要获取传进来的命令行参数,这时可以采用这个函数来获取。函数原型如下:

WINBASEAPI
LPSTR
WINAPI
GetCommandLineA(
    VOID
    );

WINBASEAPI
LPWSTR
WINAPI
GetCommandLineW(
    VOID
    );
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

3.CommandLineToArgvW函数

LPWSTR * CommandLineToArgvW(
[in] LPCWSTR lpCmdLine,
[out] int *pNumArgs
);

以类似于标准 C 运行时argv和argc值的方式解析 Unicode 命令行字符串并返回指向命令行参数的指针数组以及此类参数的计数。

  解析命令行字符串为字符串列表,功能原型如下所示:

SHSTDAPI_(LPWSTR *)  CommandLineToArgvW(_In_ LPCWSTR lpCmdLine, _Out_ int* pNumArgs);
  • 1

  使用范例如下:

	//解析参数
	int argc = 0;
	std::wstring cmdStr = GetCommandLineW();
	LPWSTR *argv = CommandLineToArgvW(cmdStr.c_str(), &argc);
	if (argc != 3)
	{
		exit(0);//参数不正确
	}
	auto src_filename_w = argv[1];
	auto dst_filename_w = argv[2];
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

4.作者答疑

  如有疑问,敬请留言。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/467133
推荐阅读
相关标签
  

闽ICP备14008679号