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

假如我们有一个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);
	}
}

你可能感兴趣的:(C++语言,操作系统)