`

《Windows API巡礼》---GetCurrentDirectory和GetModuleFileName

 
阅读更多

使用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函数(最低配置WindowsXP with SP2Windows Server2003 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)

{

printf("获取当前目录错误/n");

return 0;

}

_tprintf("进程的当前目录为:%s/n", szCurrentDirectory);

//将进程当前目录设置为"C:/"

if(SUCCEEDED(StringCchCopy(szCurrentDirectory, MAX_PATH, "C://")))

{

if(!SetCurrentDirectory(szCurrentDirectory))

{

printf("设置当前目录失败/n");

return 0;

}

printf("已经设置当前目录为:%s/n", szCurrentDirectory);

//在当前目录下创建子目录"ASCE1885"

CreateDirectory("ASCE1885", NULL);

//再次获取系统当前目录

dwCurDirPathLen = GetCurrentDirectory(MAX_PATH, szCurrentDirectory);

if(dwCurDirPathLen == 0)

{

printf("获取当前目录失败/n");

return 0;

}

_tprintf("再次获取的当前目录为:%s/n", szCurrentDirectory);

}

//使用NULL参数,获取本模块的路径

if(!GetModuleFileName(NULL, szModulePath, MAX_PATH))

{

printf("获取模块路径错误/n");

return 0;

}

_tprintf("本模块路径为:%s/n", szModulePath);

//获取Kernel32.dll的模块句柄

hKernel32 = LoadLibrary(szKernel32);

//使用Kernel32.dll的模块句柄获取其路径

if(!GetModuleFileName(hKernel32, szModulePath, MAX_PATH))

{

printf("获取Kernel32模块路径失败/n");

return 0;

}

_tprintf("Kernel32模块路径是:%s/n", szModulePath);

system("pause");

return 0;

}

几点需要注意的:

1)在进程中使用相对路径,则相对路径的起始点是程序的当前路径而不是可执行文件所在的路径;

2)进程的当前路径在默认情况下是应用程序可执行文件所在的路径;

3)模块路径和程序的当前路径是两个概念,进程的主程序和进程中所加载的所有DLL都是进程的模块。

分享到:
评论

相关推荐

    API函数---c++

    在Windows开发环境中,API(Application Programming Interface,应用程序编程接口)提供了一系列预定义的功能,允许开发者在不深入操作系统底层细节的情况下完成特定的任务。本文将围绕给定的文件信息,深入探讨...

    所有windows系统API全集

    Windows API,全称为Application Programming Interface,是微软操作系统提供的一系列函数和过程,允许开发者访问操作系统的核心功能。这些API包括各种各样的功能,如用户界面交互、文件管理、网络操作、系统控制等...

    分享WindowsAPI手册样本.doc

    本文档提供了 Windows API 手册样本,涵盖了网络函数、消息函数和文件处理函数三大类。 一、网络函数 1. WNetAddConnection:创立同一个网络资源的永久性连接。 2. WNetAddConnection2:创立同一个网络资源的连接...

    WindowsAPI32使用大全

    总之,《Windows API32 使用大全》涵盖了Windows编程中的关键元素,是开发者解决网络、消息处理和文件管理问题的宝贵资源。通过理解和熟练应用这些API,开发者能够构建出功能强大且高效的Windows应用程序。

    Windows API函数清单 一个文档

    Windows API是Windows操作系统的核心接口,它提供了一系列函数供开发者使用,以实现对系统资源的管理和控制。本篇文章将深入探讨Windows API中的网络函数、消息函数和文件处理函数,这三个主要的知识点。 首先,...

    Windows API函数大全(功能简介)

    Windows API 函数大全(功能简介) Windows API 函数大全是个人收集的 Windows API 函数功能介绍,已经分好类,需要的时候...这些 Windows API 函数可以帮助开发者更好地开发 Windows 应用程序,提高开发效率和质量。

    PB WINDOWS API大全

    PB WINDOWS API大全是Windows API for Powerbuilder 12.5,旨在提供PowerBuilder开发中常用的Win32 API函数的使用方法和实践经验。通过这些函数,开发者可以更好地控制Windows操作系统,实现更复杂的功能。 一、...

    Windows API函数大全

    ### Windows API函数详解 在深入探讨Windows API函数之前,我们先来...这些API函数覆盖了Windows操作系统中几乎所有核心的文件和网络操作需求,对于开发者来说,熟练掌握它们能够极大地提高应用程序的功能性和效率。

    windows api 函数

    - **GetBinaryType/GetCompressedFileSize/GetCurrentDirectory/GetDiskFreeSpace/GetDiskFreeSpaceEx**:用于获取文件类型、大小、当前目录和磁盘空间信息,对于系统监控和文件管理极为重要。 综上所述,Windows ...

    windows API 函数清单

    Windows API 是微软操作系统提供的一系列函数接口,允许程序员访问操作系统的核心功能,如用户界面、文件系统、网络通信等。以下是一些重要的Windows API函数及其详细说明: 1. **网络函数**: - `...

    Windows API函数大全.pdf

    ### Windows API函数大全知识点概述 #### 一、API之网络函数 **1.1 WNetAddConnection** - **功能**: 创建一个与特定网络资源的永久性连接。 - **参数**: 包括网络资源的路径、用户名、密码等。 - **应用场景**: 当...

    Windows C++ API 函数大全

    Windows C++ API 函数是开发Windows应用程序的基础,涵盖了操作系统的核心功能,如网络操作、消息处理、文件管理和系统交互。以下是对这些函数的详细介绍: 1. **网络函数**: - `WNetAddConnection`:创建一个与...

    windows API函数大全

    以下是对标题和描述中提及的部分Windows API函数的详细解释: **1. 网络函数** - `WNetAddConnection` 和其变体:这些函数用于建立与网络资源的连接,允许用户访问共享的网络文件和打印机。 - `...

    WINDOWS_API_函数的整理笔记综合.doc

    在Windows API中,这些函数是开发者进行网络操作、消息处理和文件管理的关键工具。下面将分别详细介绍这些领域的关键函数。 1. **网络函数**: - **WNetAddConnection**,**WNetAddConnection2** 和 **...

    Windows API

    ### Windows API 关键知识点 #### 一、关闭内核对象 - `CloseHandle` **功能概述:** `CloseHandle` 是 Windows API 中用于关闭一个内核对象的函数。这些内核对象包括但不限于文件、文件映射对象、进程、线程、安全...

Global site tag (gtag.js) - Google Analytics