开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 549|回复: 3
收起左侧

[求助] DLL怎么用?SetDefaultDllDirectories setDllDirectoryA AddDllDirectory

[复制链接]
结帖率:92% (36/39)
发表于 2024-2-16 13:05:14 | 显示全部楼层 |阅读模式   湖南省株洲市
这三个DLL怎么用?
SetDefaultDllDirectories

setDllDirectoryA

AddDllDirectory



这三个函数怎么用?

我想实现添加多个DLL目录到软件内以供搜索

我查了一下,以上三个函数可以实现,请问下怎么实现啊?



补充内容 (2024-2-16 17:13):
已解决
结帖率:92% (36/39)

签到天数: 1 天

 楼主| 发表于 2024-2-16 13:05:54 | 显示全部楼层   湖南省株洲市
[C++] 纯文本查看 复制代码
是的,Windows API 提供了 `AddDllDirectory` 函数,它允许你将多个目录添加到进程的 DLL 搜索路径中。这个函数特别有用,当你需要在不修改系统级别的搜索路径的情况下,为特定的应用程序或进程指定额外的 DLL 搜索目录。

`AddDllDirectory` 函数的原型如下:

```c
DLL_DIRECTORY_COOKIE AddDllDirectory(PCWSTR NewDirectory);
```

- `NewDirectory` 参数是一个指向要添加到搜索路径的目录的绝对路径字符串。

函数返回一个不透明的指针(`DLL_DIRECTORY_COOKIE`),这个指针可以用来在需要时从进程 DLL 搜索路径中移除该目录。如果函数成功,返回的是一个有效的指针;如果失败,返回值为零。要获取更多错误信息,可以调用 `GetLastError` 函数。

使用 `AddDllDirectory` 函数时,需要注意以下几点:

1. 如果你首先使用 `LOAD_LIBRARY_SEARCH_USER_DIRS` 标志调用 `SetDefaultDllDirectories` 函数,那么使用 `AddDllDirectory` 指定的目录将被添加到进程的 DLL 搜索路径中。
2. 如果没有调用 `SetDefaultDllDirectories`,那么 `AddDllDirectory` 函数指定的目录仅用于后续的 `LoadLibraryEx` 函数调用。
3. 如果你添加了多个目录,搜索这些目录的顺序是未指定的。

要移除之前添加的目录,你可以使用 `RemoveDllDirectory` 函数,传入之前 `AddDllDirectory` 返回的指针。

这个函数在 Windows 8 及更高版本的操作系统中可用,但在 Windows 7、Windows Server 2008 R2、Windows Vista 和 Windows Server 2008 上,你需要安装 KB2533623 更新才能使用这个函数。在这些旧版本的 Windows 上,你需要通过 `GetProcAddress` 从 `Kernel32.dll` 获取函数地址。


 在 C 语言中,你可以使用 `AddDllDirectory` 函数来添加多个 DLL 搜索目录。以下是一个简单的示例,展示了如何使用这个函数:

```c
#include <windows.h>
#include <libloaderapi.h>

int main() {
    // 假设你有两个目录想要添加到 DLL 搜索路径中
    const wchar_t* directories[] = {
        L"C:\\MyDllDirectory1",
        L"C:\\MyDllDirectory2"
    };

    // 获取当前的 DLL 搜索模式
    ULONG flags = GetDefaultDllDirectories();

    // 设置为搜索用户目录
    SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_USER_DIRS);

    // 添加额外的目录到 DLL 搜索路径
    for (size_t i = 0; i < sizeof(directories) / sizeof(directories[0]); ++i) {
        DLL_DIRECTORY_COOKIE cookie = AddDllDirectory(directories);
        if (cookie == NULL) {
            // 处理错误
            printf("Failed to add directory %ls\n", directories);
            break;
        }
    }

    // ... 你的代码,例如加载 DLL ...

    // 在程序结束时,移除之前添加的目录
    for (size_t i = 0; i < sizeof(directories) / sizeof(directories[0]); ++i) {
        if (RemoveDllDirectory(directories) == FALSE) {
            // 处理错误
            printf("Failed to remove directory %ls\n", directories);
        }
    }

    return 0;
}
```

请注意,这个示例假设你已经有了 `libloaderapi.h` 头文件,并且你的编译器支持这些函数。在实际应用中,你可能需要根据你的开发环境和目标平台进行相应的调整。此外,确保在添加和移除目录时处理可能出现的错误。
回复 支持 反对

使用道具 举报

结帖率:92% (36/39)

签到天数: 1 天

 楼主| 发表于 2024-2-16 14:41:02 | 显示全部楼层   湖南省株洲市
.版本 2

' 将使用到kernel32.dll中的SetDllDirectory、AddDllDirectory和SetDefaultDllDirectories

' SetDllDirectory用于指定设置系统搜索路径
' AddDllDirectory用于提交用户定义的系统所有路径
' 关键在于SetDefaultDllDirectories,用于指定需要所有路径的类型
回复 支持 反对

使用道具 举报

结帖率:60% (3/5)

签到天数: 2 天

发表于 2024-2-17 20:38:25 | 显示全部楼层   上海市上海市
类似大漠的设置全局目录
回复 支持 反对

使用道具 举报

  高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表