根据您的要求,我正在根据我的评论做出回答。
执行此操作的正确方法是让您的 DLL 的用户自己处理这种情况。作为 API 开发人员,你的工作绝对不是担心防火墙之类的事情:要么 API 用户和/或最终用户确保它正常工作,要么你优雅地失败了。正如其他人所说,最终用户无法回答 UAC 请求(例如在无头服务器上)的原因有很多,因此您不能依赖在交互式上下文中使用您的 DLL。这根本不是你的责任。
如果你真的必须继续你最初的想法(我再次强调,恕我直言,这是一个坏主意),我最好的选择是将你的 DLL 一分为二:
- DLL 本身,没有任何清单,因此它可以在任何用户下运行,
- 和一个单独
.exe
的清单,需要管理员权限,只有在需要时才会由您的 DLL 运行。
只需要求两者都存储在同一个目录中,这样您就可以轻松找到您的 DLL(以及.exe
's)目录GetModuleFileName
。
其他人已经指出runas
或RunDll
(这是同样有效的答案 IMO),但我更多的是 Unix-y 类型,因此我建议完全使用单独的二进制文件。从长远来看,我发现它更容易维护。
“介于两者之间”的解决方案是您的 DLL 根本不打扰防火墙(应该如此),但您提供了一个完全独立的工具(.exe
带有清单),可以帮助您的用户在需要时正确设置防火墙。这可能是最好的解决方案:简洁的设计(责任分离),您仍然为用户提供所有必需的工具。