现在的位置: 首页 > 综合 > 正文

《Windows API巡礼》—GetCurrentDirectory和GetModuleFileName

2013年08月28日 ⁄ 综合 ⁄ 共 2251字 ⁄ 字号 评论关闭

使用GetCurrentDirectorySetCurrentDirectory可以获取程序的当前目录,使用GetModuleFileName可以获取模块的路径,如果以NULL为参数调用GetModuleFileName,将会返回当前模块的路径。如果在程序主模块(.exe)中获取当前模块路径,便可以从当前的路径中提取出程序运行时所在的路径。下面分别介绍:

1GetCurrentDirectory函数用于获取当前进程所在的目录:

DWORD WINAPI GetCurrentDirectory(

  __in   DWORD nBufferLength, //路径字符串缓冲区的大小(TCHAR为单位)

//需包含结尾null字符所需空间,一般赋值为MAX_PATH

  __out  LPTSTR lpBuffer //指向获取的路径字符串,字符串以null结尾

);

当指定参数nBufferLength0lpBufferNULL时,函数将返回所需缓冲区的大小;

 

返回值:

成功时,返回写到缓冲区的字符数,不包括结尾null字符;

失败时,返回值是0,可用GetLastError()获得进一步错误信息;

如果lpBuffer指向的缓冲区大小不足,返回值将指定所需的缓冲区大小(字符数,包括null结束符)。

 

函数用法实例:

#include <windows.h>

#include <stdio.h>

#include <tchar.h>

 

#define BUFSIZE MAX_PATH      //缓冲区大小

 

int main(int argc, TCHAR **argv)

{

         TCHAR buffer[BUFSIZE];

         DWORD dwRet;

        

         dwRet = GetCurrentDirectory(BUFSIZE, buffer);

         if(dwRet == 0) //函数执行失败

         {

                   printf("GetCurrentDirectory failed (%d)/n", GetLastError());

                   return 1;

         }

         if(dwRet > BUFSIZE) //缓冲区空间不足

         {

                   printf("Buffer too small, need %d characters/n", dwRet);

                   return 1;

         }

         _tprintf(TEXT("The current directory is : %s/n"), buffer); //控制台输出进程当前目录

        

         system("pause");

         return 0;

}

 

2SetCurrentDirectory函数用于设置进程的当前目录:

BOOL WINAPI SetCurrentDirectory(

  __in  LPCTSTR lpPathName //要设置的路径值

);

返回值:

成功时,返回非0值,表示获取的字符串的长度;

失败时,返回0值,调用GetLastError()函数查看进一步错误信息

 

3GetModuleFileName函数用于获得模块的文件名,当第一个参数为NULL时,表示获取当前模块的路径:

DWORD WINAPI GetModuleFileName(

  __in_opt  HMODULE hModule, //模块句柄

  __out     LPTSTR lpFilename, //返回的模块的全路径

  __in      DWORD nSize //lpFilename指向的缓冲区的大小(TCHAR为单位)

);

返回值:

成功时,返回非零值,表示获取的路径的字符串长度;

失败时,返回零值。

 

实例程序如下:

#include <windows.h>

#include <stdio.h>

#include <tchar.h>  //包含_tprintf等函数

#include <Strsafe.h> //包含StringCchCopy函数(最低配置Windows XP with SP2Windows Server 2003 with SP1

 

/************************************************

* 功能:获取当前目录、获取程序所在目录、¡

* 获取模块路径

************************************************/

int main(int argc, TCHAR **argv)

{

    //用于存储当前路径

    TCHAR szCurrentDirectory[MAX_PATH];

    //用于存储模块路径

    TCHAR szModulePath[MAX_PATH];

    //Kernel32文件名与句柄

    LPTSTR szKernel32 = TEXT("kernel32.dll");

    HMODULE hKernel32 = NULL;

    //当前路径的长度,可用于判断获取是否成功

    DWORD dwCurDirPathLen;

    //获取进程当前目录

    dwCurDirPathLen = GetCurrentDirectory(MAX_PATH, szCurrentDirectory);

    if(dwCurDirPathLen == 0)

抱歉!评论已关闭.