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


    1.SetCurrentDirectoryA函数

    BOOL SetCurrentDirectory([in] LPCTSTR lpPathName);

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

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

    #include "windows.h"
    #include 
    #include 
    #include 
    //设置当前目录为程序文件所在目录, 返回应用程序所在目录
    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.作者答疑

      如有疑问,敬请留言。

  • 相关阅读:
    【学计算机都可收藏】《信息资源管理》第6章,信息资源安全管理
    HSQL总结
    无胁科技-TVD每日漏洞情报-2022-10-28
    Mssql安装使用
    业务可视化-让你的流程图"Run"起来(6.定时任务&Spring-Batch的集成)
    做区块链卡牌游戏有什么好处?
    Spring Boot集成支付宝电脑网站支付功能
    JS中使用递归的一次探索
    Go runtime 调度器精讲(九):系统调用引起的抢占
    leetcode 108.将有序数组转换为二叉搜索树
  • 原文地址:https://blog.csdn.net/m0_67316550/article/details/126189425