1105110683 发表于 2026-8-30 02:44:46

DLL里怎么获取自身文件名和路径?

本帖最后由 1105110683 于 2026-8-30 02:46 编辑

DLL里怎么获取自身DLL文件名和路径?

cxz7411 发表于 2026-8-30 10:25:44

本帖最后由 cxz7411 于 2026-8-30 10:27 编辑

加载dll时参数中有模块句柄,通过模块句柄再去获取自身文件名和路径,具体使用的api去问ai就行.

叶孤城 发表于 2026-8-30 20:03:27

取模块目录()

1105110683 发表于 2026-8-31 11:34:08

本帖最后由 1105110683 于 2026-8-31 11:48 编辑

叶孤城 发表于 2026-8-30 20:03
取模块目录()
取到的是DLL文件所在目录,没文件名

叶孤城 发表于 2026-8-31 12:49:53

本帖最后由 叶孤城 于 2026-8-31 12:52 编辑

1105110683 发表于 2026-8-31 11:34
取到的是DLL文件所在目录,没文件名
通过模块句柄调用 GetModuleBaseNameW 是 Windows API 中的一个函数,用于获取指定进程内某个模块的基本名称(Base Name)
GetModuleFileNameExW 是 Windows API 中用于获取指定进程内某个模块的完整路径的函数

用这两个函数就能实现需要的功能了.

1105110683 发表于 2026-8-31 15:34:43

叶孤城 发表于 2026-8-31 12:49
通过模块句柄调用 GetModuleBaseNameW 是 Windows API 中的一个函数,用于获取指定进程内某个模块的基本 ...

这样可以吗?

<火山程序 类型 = "通常" 版本 = 1 />

方法 取当前模块完整路径 <公开 静态 类型 = 文本型 注释 = "获取文件完整磁盘路径" 折叠 @禁止流程检查 = 真>
{
    变量 结果路径 <类型 = 文本型>
    @ HMODULE hMod = _AtlBaseModule.GetModuleInstance();
    @ WCHAR szPath = {0};
    @ DWORD dwRet = GetModuleFileNameW(hMod, szPath, MAX_PATH);
    @ if(dwRet > 0 && dwRet < MAX_PATH)
    @ {
    @   @<结果路径>.SetText(szPath);
    @ }
    @ else
    @ {
    @   @<结果路径>.SetText(L"");
    @ }
    返回 (结果路径)
}

HS糖糖 发表于 2026-8-31 15:52:29

<火山程序 类型 = "通常" 版本 = 1 />

方法 入口通知 <公开 类型 = 逻辑型 注释 = "动态库的 DllMain 入口函数通知" 折叠 @虚拟方法 = 可覆盖>
参数 模块句柄 <类型 = 变整数 注释 = "动态库自身的模块句柄">
参数 调用原因 <类型 = 整数>
参数 保留指针 <类型 = 变整数>
{
    如果 (调用原因 == 1)
    {
      变量 结果路径 <类型 = 文本型>
      @ WCHAR szPath = {0};
      @ DWORD dwRet = GetModuleFileNameW((HMODULE)@<模块句柄>, szPath, MAX_PATH);
      @ @<结果路径>.SetText(szPath);

      调试输出 (结果路径)

    }



    返回 (父对象.入口通知 (模块句柄, 调用原因, 保留指针))// 调用基础类中的被覆盖虚拟方法
}
页: [1]
查看完整版本: DLL里怎么获取自身文件名和路径?