zoukankan      html  css  js  c++  java
  • 获取当前进程目录 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
    ", path);
    
        TCHAR pathm[MAX_PATH];
        GetModuleFileName(NULL, pathm, MAX_PATH);
        wprintf(L"%s
    ", 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 修改的。

  • 相关阅读:
    遭遇奸商(主板篇)
    空调匹数与房间制冷时对应的适用面积
    MDIHelp!窗口BUG
    数据库主键设计之思考(转)
    显卡功耗表(转)
    PowerBuilder中的几种通用类
    PowerBuilder常用技巧
    当adobe flash player不能安装时
    vue常用语法
    简单的数据库命令
  • 原文地址:https://www.cnblogs.com/XiHua/p/5083425.html
Copyright © 2011-2022 走看看