当dll被其他语言调用的时候,如何在dll中获取所在路径呢?这个需求看似很平常,但一番尝试还是几经波折。
一、使用绝对路径,这在自己的电脑是可行的,如果路径设置合理,在大多数电脑上应该也是运行正常的,但这不是我们想要的,我就想获得dll当前所处路径。
二、使用相对路径,这看起来是不错的方案,但编译运行死活不正常,相对路径不对,查资料解释说相对路径的当前目录不一定等于应用程序执行文件的所在目录,应用程序启动,当前目录可以被任意设置。
三、外部语言传路径给dll,这应是可以的,但这里也有个问题,我要路径的地方是个静态库,它被主的dll使用,白话解释就是我要向我同事的闺蜜告白,就算同事愿意牵线还是挺费劲的。
四、尝试在dll调用内部获得路径,使用GetModuleFileName这个API,它需要3个参数,第一个参数是HMODULE类型模块句柄,使用NULL获得启动应用程序全路径,第2个参数是一个指向字符串缓冲区的指针,第3个参数是这个缓冲区的最大字符数量。
第四种方案补充,进一步使用VirtualQuery,如果找到,则使用MEMORY_BASIC_INFORMATION内存结构体的模块句柄信息;没找到则用NULL。
重要代码
HMODULE GetSelfModuleHandle()
{
//Windows内存与结构管理结构体
MEMORY_BASIC_INFORMATION mbi;
//查询内存的状态
return ((::VirtualQuery(GetSelfModuleHandle, &mbi, sizeof(mbi)) != 0) ? (HMODULE)mbi.AllocationBase : NULL);
}