windows下DLL库里如何获取动态库文件名称

本文为博主原创文章,未经博主允许不得转载。(合作洽谈请联系QQ:1010316426)

假如我们有一个DLL库为C://xyz//abc.dll
现在想在abc.dll库内部获取这个文件的名称。该dll库被一个叫做myapp.exe的程序调用。
一般会想到通过GetModuleFileName来获取库名称,但是其第一个参数HMODULE hModule无法知道。如果给hModule赋值为NULL,那么只能得到调用该DLL的myapp.exe的文件名称。所以不能直接使用这个API。

windows给我们提供了另一个API可以获取到这个DLL库的hModule,即 GetModuleHandleEx。
该函数原型如下:

WINBASEAPI
BOOL
WINAPI
GetModuleHandleExA(
    _In_ DWORD dwFlags,
    _In_opt_ LPCSTR lpModuleName,
    _Out_ HMODULE* phModule
    );

其中,第三个参数是输出参数,即我们想知道的hModule。第二个参数填写一个这个abc.dll库里面的函数名即可。
完整示例代码如下:

string g_strFullPathName;
string g_strFullPath;
string g_strDllNameExt;
string g_strDllName;

int Init(/*some param*/);//动态库声明的API函数

void ParseModuleName()
{
	char strFilePath[1024];
	memset(strFilePath, 0, 1024);
	//::GetModuleFileName(NULL, strFilePath, 2048);//第一个参数如果提供NULL,只能得到创建进程的那个EXE文件的名称。
	HMODULE hModule = NULL;
	::GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,
		(LPCSTR)&Init, //这是函数名,强转
		&hModule);
	DWORD len = ::GetModuleFileName(hModule, strFilePath, 1024);

	g_strFullPathName = std::string(strFilePath);

	string::size_type iIndex = g_strFullPathName.find_last_of("\\");
	if (iIndex != std::string::npos)
	{
		g_strFullPath = g_strFullPathName.substr(0, iIndex + 1);
		g_strDllNameExt = g_strFullPathName.substr(iIndex + 1, g_strFullPathName.length());
		g_strDllName = g_strDllNameExt.substr(0, g_strDllNameExt.length() - 4);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值