GetModuleFileName

来源:互联网 发布:看图软件推荐 编辑:程序博客网 时间:2024/06/04 18:44
GetCurrentDirectory与GetModuleFileName
GetModuleFileName是获得程序当前的运行目录
GetCurrentDirectory获取当前进程所有在的目录

Copy code CFileDialog fdlg(true);
 fdlg.DoModal();//////
 TCHAR *pBuffer = new TCHAR[1024];
 ZeroMemory(pBuffer, 1024);
 GetCurrentDirectory(1024, pBuffer);
 MessageBox(pBuffer, L"GetCurrentDirectory");
 ZeroMemory(pBuffer, 1024);
 GetModuleFileName(NULL, pBuffer, 1024);
 MessageBox(pBuffer, L"GetModuleFileName");



GetModuleFileName(NULL,szText,MAX_PATH);//只有第一个参数为NULL,返回当前模块的PathName,否则返回对应dll路径   
  GetFullPathName("",MAX_PATH,szText,NULL);//根据第一个参数提供的文件名(可用相对路径,8.3格式)扩充到含驱动器和目录



获取路径及目录信息
 
获取路径
Use GetModuleFileName 获得应用程序的路径,然后去掉可执行文件名。
Example:
TCHAR exeFullPath[MAX_PATH]; // MAX_PATH在API中定义了吧,好象是128
GetModuleFileName(NULL,exeFullPath,MAX_PATH)

获得各种目录信息
Windows目录: Use "GetWindowsDirectory“
 system目录: Use "GetSystemDirectory"
   temp目录: Use "GetTempPath "
   当前目录: Use "GetCurrentDirectory"

请注意前两个函数的第一个参数为 目录变量名,后一个为缓冲区; 后两个相反.

//---------------------------------------------------------------------
获得当前工作目录的路径

调用SDK函数GetCurrentDirectory可以获得当前工作目录的路径。
下面的例子在 CString对象中创建一个返回当前工作目录的函数:
 CSrting GetCurrentWorkingDir ()  
{    
CString strDir ;      
: : GetCurrentDirectory (MAX_PATH, strDir . GetBuffer (MAX_PATH ));      
strDir. ReleaseBuffer  ( )      
return strDir ;  }      
调用SDK函数GetModuleFileName可以获取应用程序的路径,然后除去可以执行文件名部分。下面的例子是一个函数,可以调用以确定所载入的应用程序目录。在初始化过程中工作框调用GetModuleFileName并在CWinApp: : m _pszhelpFilePath中主帮助文件路径。如果没有指定新的帮助文件目录,可以使用m_pszHelpFilePath而不必调用GetModuleFileName。  
void GetLaunchedDir (Cstring &―> strLaunched)  
{      
TCHAR szFullPath [MAX_PATH];      
TCHAR szDir [_MAX_DIR];      
TCHAR szDrive [_MAX_DRIVE];  //Get application's full path.  
: : GetModuleFileName (NULL, szFullPath , MAX_PATH);  
//Break full path into separate components .  
_splitpath (szFullPath, szDrive , szDir , NULL , NULL );  
//Store application's drive and path .  
strLaunched . Format (_T ("%s%s"), szDrive , szDir );  
}      
该函数返回一个长路径名,工作框中的一些函数如AfxOleRegisterControlClass和CDocManager : : RegisterShellFileTypes使用AfxGetModuleShortFileName半文档化的函数来代替GetModuleFileName, 该函数返回一个模块的短路径名,该函数在AFXPRIV.H中说明,在FILECORE.CPP中实现。
下面就是该函数的实现:  
void AFXAPI AfxGetModuleShortFileName (HINSTANGCE hInst , Cstring &strShortName )  
{
TCHAR szLongPathName [_MAX_PATH ];             
: :GetmoduleFileName  (hInst, szLongPathName , _MAX _PATH);             
: :GetShortPathName (szLongPathName,strShortName. GetBuffer (_MAX_PATH), _MAX_PATH);             
strShortName. ReleasBuffer ();
}






VC中使用GetModuleFileName获取应用程序路径2007-07-29 16:12.\\与API函数GetModuleFileName获取应用程序目录有何不一样?
--------------------------------------------------------------------------------
采用.\\也能获得应用程序目录,采用GetModuleFileName也能获得,二者有何不同?
--------------------------------------------------------------------------------
一样!
一个是相对路径,一个是绝对路径
--------------------------------------------------------------------------------
.\\是的到应用程序的当前目录,但当前目录不一定等于应用程序执行文件的所在目录,一个应用程序被启动时,当前目录是可以被任意设置的。
GetModuleFileName()得到模块的完整路径名,例如,你载入c:\windows\system32\a.dll,得到模块句柄h,则你可以用GetModuleFileName()得到h模块的完整路径名。
--------------------------------------------------------------------------------
.\\一般用在包含头文件的语句中。
另一个是程序编译后起作用的,例如,打开自定义的配置文件等。
--------------------------------------------------------------------------------
如何去取得这个Hanlde?
--------------------------------------------------------------------------------
如果你直接用LoadLibrary()或AfxLoadLibrary()载入dll,该函数返回值就是handle;
如果你隐式载入dll, 用GetModuleHandle("dll文件名")也可以得到handle;
MFC程序得到本身路径

在开发工程中,往往需要知道当前程序本身所在目录。
一种方法是在程序安装的时候利用安装程序把文件路径写入注册表。在较大的程序中,这种方法比较常用
另一种,就是在程序得到路径。这样,程序随便移动到哪里,都可以得到正确的路径。这也是本文介绍的方法。

方法一:
[code]
//得到帮助文件的路径
CString strFullName = AfxGetApp()->m_pszHelpFilePath;
//得到的是:X:\XXXX\XXX.hlp

//解析路径,得到当前运行程序所在目录
char drive[_MAX_DRIVE];
char dir[_MAX_DIR];

_splitpath(strAppName, drive, dir, NULL,NULL);
CString strPath;
strPath.Format("%s%s", drive, dir);
//strPath即为得到的当前运行程序所在目录
[/code]
另外,AfxGetApp()->m_pszAppName 得到应用程序名称
AfxGetApp()->m_pszExeName 得到程序文件名,不包括扩展名

方法二:
得到全路径
TCHAR exeFullPath[MAX_PATH]; // MAX_PATH
GetModuleFileName(NULL,exeFullPath,MAX_PATH);//得到程序模块名称,全路径
也就是当前运行程序的全路径
利用方法一的解析路径的方法,即可得到程序所在路径。

GetModuleFileName函数原型
DWORD GetModuleFileName(
   HMODULE hModule,     // handle to module。将要得到的模块的句柄。如果是当前模块,NULL
   LPTSTR lpFilename,   // path buffer   得到的文件名。
   DWORD nSize          // size of buffer   一般MAX_PATH就可以了
);



GetModuleFileName获取程序当前执行路径

DWORD GetProgramDir(DWORD nBufferLength, LPTSTR lpBuffer)
{
    DWORD dwReturn = 0;

    if (nBufferLength <= 0 || lpBuffer == NULL)
        return dwReturn;

    dwReturn = ::GetModuleFileName(NULL, lpBuffer, nBufferLength);
    if (dwReturn <= nBufferLength)
    {
        // Remove filename from path
        LPTSTR tszSlash = _tcsrchr(lpBuffer, static_cast<int>(_T(''\\'')));
        if (tszSlash)
            *++tszSlash = _T(''\0'');
    }

    return dwReturn;
}


Return Values
If the function succeeds, the return value is the length of the string that is copied to the buffer, in TCHARs. If the buffer is too small to hold the module name, the string is truncated to nSize, and the function returns nSize.

If the function fails, the return value is 0 (zero). To get extended error information, call GetLastError.


文章出处:http://www.diybl.com/course/3_program/c++/cppjs/2008114/96493.html






GetModuleFileName

函数功能:该函数为含有指定模块的可执行文件检索全路文件名。在Windows95中,当应用程序的版本大于可或等于4.0且可得到长文件名,则该函数返回长文件名,否则,仅返回8.3格式的文件名。

函数原型:DWORD GetModuleFileName(HMODULE hModule, LPTSTR lpFilename, DWORD nsize);

参数:
hModule:指向模块的句柄,该模块的可执行文件名被请求,如果此参数为NULL,则函数GetModuleFileName返回用来创建调用进程的文件路径。
lpFilename:指向一个缓冲区的指针,该缓冲区被给定模块的路径和文件名填充。
nsize:指向一个缓冲区的字符长度,如果路径和名的长度超过此范围,则字符串被截断。

返回值:如果函数调用成功,返回值为复制到缓冲区的字符串的字符长度;否则,返回值为零。若想获得更多错误信息,请调用GetLastError函数。

备注:如果一个模块被装载到两个进程,那么在一个进程中的模块文件与在与在另一个进程中的模块文件名不一样。

速查:Windows NT:3.1及以上版本;Windows:95及以上版本;Windows CE:不支持;头文件:winbase.h;库文件:kernel32.lib;Unicode:在Windows NT上实现为Unicode和ANSI两种版本。




Windows API一日一练(83)GetModuleFileName函数

在开发软件的过程里,经常需要把数据保存到当前执行文件路径下面,或者读取当前执行文件路径下的一些配置信息。这时就需要从当前模块里获取所在的目录路径,以便进行固定的位置操作文件。要解决这个需求,就需要调用API函数GetModuleFileName来获取模块所在的路径。
 
函数GetModuleFileName声明如下:
WINBASEAPI
DWORD
WINAPI
GetModuleFileNameA(
    __in_opt HMODULE hModule,
    __out_ecount_part(nSize, return + 1) LPCH lpFilename,
    __in     DWORD nSize
    );
WINBASEAPI
DWORD
WINAPI
GetModuleFileNameW(
    __in_opt HMODULE hModule,
    __out_ecount_part(nSize, return + 1) LPWCH lpFilename,
    __in     DWORD nSize
    );
#ifdef UNICODE
#define GetModuleFileName GetModuleFileNameW
#else
#define GetModuleFileName GetModuleFileNameA
#endif // !UNICODE
hModule是模块的句柄,或者设置为NULL表示当前模块。
lpFilename是保存路径的缓冲区。
nSize是缓冲区的大小。
 
调用函数的例子如下:
#001 //获取当前程序所在路径。
#002  //蔡军生 2007/12/05 QQ:9073204 深圳
#003  void TestGetExePath(void)
#004  {
#005         //
#006         const int nBufSize = 512;
#007         TCHAR chBuf[nBufSize];
#008         ZeroMemory(chBuf,nBufSize);
#009
#010         //获取当前执行文件的路径。
#011        if (GetModuleFileName(NULL,chBuf,nBufSize))
#012         {
#013               //输出带文件名称路径。
#014               OutputDebugString(chBuf);
#015               OutputDebugString(_T("\r\n"));
#016
#017               //获取文件路径。
#018               TCHAR* lpStrPath = chBuf;
#019               PathRemoveFileSpec(lpStrPath);
#020               OutputDebugString(lpStrPath);
#021               OutputDebugString(_T("\r\n"));
#022         }
#023
#024  }
 
输出的结果如下:
g:\work\windows_api\wincpp2\debug\WinCpp.exe
g:\work\windows_api\wincpp2\debug
 

#kahn178 发表于2007-12-06 10:18:09  IP: 116.30.18.*
WINBASEAPI
DWORD
WINAPI
GetModuleFileNameA(
__in_opt HMODULE hModule,
__out_ecount_part(nSize, return + 1) LPCH lpFilename,
__in DWORD nSize
);

这一段怎么有两次呢,是不是发多了,还是必须要这样做,我看到您的很多篇里面都有这样的情况,所以想问一下,因为我不是太明白。
2007-12-06 21:28:42作者回复
就是ANSI与UNICODE字符的差别。#ys19811110 发表于2007-12-06 12:06:56  IP: 218.247.158.*
GetModuleFileNameA 是ASCII版本
GetModuleFileNameW 是Unicode版本
#kmlxk 发表于2007-12-07 08:31:06  IP: 222.178.10.*
强大了,堪称中文版的API SDK~~#kahn178 发表于2007-12-10 09:19:32  IP: 116.30.18.*
谢谢!~!!






用GetModuleFileName获取程序当前执行文件名
在开发过程中经常需要获得程序当前的运行目录,这时就可以使用GetModuleFileName函数
DWORD WINAPI GetModuleFileName(
  HMODULE hModule,
  LPTSTR lpFileName,
  DWORD nSize
);

hModule:要获取文件名的模块名柄,null表示当前模块
lpFileName:输出参数,存放取得的文件名
nSize:lpFileName参数的长度


void FileName()
{
    TCHAR lpFileName[MAX_PATH];
    ::GetModuleFileName(null, lpFileName, MAX_PATH);
    SetDlgItemText(IDC_TEXTBOX, lpFileName);
}