获取当前进程目录 GetCurrentDirectory() 及 获取当前运行模块路径名GetModuleFileName()

GetCurrentDirectory 获得的是当前进程的活动目录(资源管理器决定的),可以用SetCurrentDirectory 修改的。

转自 http://m.blog.csdn.net/blog/scuthanman/10094793

 

GetModuleFileName函数可以获取当前执行模块所在位置的绝对路径名,无论是哪里的进程对模块进行调用。

而GetCurrentDirectory获取的是当前进程所在的当前目录,跟执行模块所在的位置并没有关系,返回的是主进程所在目录。

 

GetCurrentDirectory函数原型
DWORD GetCurrentDirectory(
  DWORD nBufferLength,
  LPTSTR lpBuffer
);
Parameters
nBufferLength: 接收保存路径的字符串缓存长度, 缓存必须有一个保存结束的空字符的位置.
lpBuffer:指向接收字符串的缓存,收到的非空字符串指定了当前目录的绝对路径. 

The GetCurrentDirectory function retrieves the current directory for the current process.

    TCHAR path[MAX_PATH] = {0};
    GetCurrentDirectory(MAX_PATH, path);
GetCurrentDirectory返回当前进程的当前目录,并不一定返回你的exe应用程序的目录。如果你在应用程序中调用了打开文件对话框,你选择了一个文件,那么,这个文件所在的目录就成了当前进程的当前目录了。

复制代码
复制代码
#include "stdafx.h"
#include <Windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
    TCHAR path[MAX_PATH] = {0};
    GetCurrentDirectory(MAX_PATH, path);
    wprintf(L"%s\n", path);

    TCHAR pathm[MAX_PATH];
    GetModuleFileName(NULL, pathm, MAX_PATH);
    wprintf(L"%s\n", pathm);
    system("pause");

    return 0;
}
复制代码

 

复制代码

 

2、

  DWORD GetModuleFileName(
  HMODULE hModule,
  LPTSTR lpFilename,
  DWORD nSize
  );

  函数参数说明:
  hModule HMODULE 装载一个程序实例的句柄。如果该参数为NULL,该函数返回该当前应用程序全路径。
  lpFileName LPTSTR 是你存放返回的名字的内存块的指针,是一个输出参数
  nSize DWORD ,装载到缓冲区lpFileName的最大值
  函数返回值:
  如果返回为成功,将在lpFileName的缓冲区当中返回相应模块的路径,如果所为的nSize过小,哪么返回仅按所设置缓冲区大小返回相应字符串内容。
  如果函数失败,返回值将为0,并返回GetLastError异常代码。
  需要的头文件为:
  include Windows.h

 

 

下面的例子是错的,因为不确定前进程目录是固定的

复制代码
    if (_access("uny.ini", 0) == 0)
    {
        //首先检查当前路径是否存在配置文件
        strcpy(&sCfgFile[0], DEFAULT_CFG_FILE);
    }
    else
    {
        GetSystemDirectoryA(sCfgFile, sizeof(sCfgFile) - 1);
        strcat(&sCfgFile[0], "\\");
        strcat(&sCfgFile[0], DEFAULT_CFG_FILE);
    }
                     
复制代码

应该用 

复制代码
    TCHAR module_path[MAX_PATH] = { 0 };
    DWORD dw_ret = GetModuleFileName(NULL, module_path, MAX_PATH);
    _tstring dll_path = module_path;
    if (0 != dw_ret)
    {
        size_t pos = dll_path.find_last_of('\\');
        if (-1 != pos)
        {
            dll_path = dll_path.substr(0, pos + 1);
        }
    }
复制代码

获取exe所在的目录,不会根据进程目录的改变而改变。

要知道进程的目录是可以用 SetCurrentDirectory 修改的。

posted @   曦花  阅读(2984)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示