制作替换系统库中的函数调用的 DLL 时出现问题

Posted

技术标签:

【中文标题】制作替换系统库中的函数调用的 DLL 时出现问题【英文标题】:Issues making a DLL that replaces function calls from a system library 【发布时间】:2012-12-03 20:46:46 【问题描述】:

我正在尝试在 Windows 上制作一个假的 opengl32.dll 来捕获 OpenGL 调用。当我将 DLL 与简单的 OpenGL 应用程序放在同一目录中并运行时,我收到此错误:

在动态链接库OPENGL32.dll中找不到程序入口点glMap1f

这很奇怪,因为我的代码中有一个用于每个 OpenGL 调用的虚拟函数,包括这个。在我的头文件中,我有:

void __declspec(dllexport) glMap1f (GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);

在源文件中:

void  glMap1f (GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points)

而且我很确定编译器没有对其进行优化,因为在文本编辑器中查看 DLL,我可以找到文本“glMap1f”。

这可能是什么原因造成的?另外,我不确定如何让 Visual Studio 调试覆盖实际系统 DLL 的 DLL,所以我无法获得更多信息。

【问题讨论】:

使用 Dependency Walker 找出您的 DLL 导出的真正名称。 【参考方案1】:

您可能需要在 glMap1f 声明前使用extern "C" 以防止编译器对其使用名称修改。

【讨论】:

除此之外,您还应该确保导出的序号匹配。鲜为人知的事实是,您不仅可以通过字符串还可以通过数值从 DLL 请求符号。

以上是关于制作替换系统库中的函数调用的 DLL 时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

关于delphi中动态调用dll时出现的问题

失败 - 下载 Ionic.Zip.dll 制作的 zip 文件时出现网络错误

Golang调用windows下的dll动态库中的函数

VC++ 解决dll库动态库加载失败问题(调用LoadLibrary加载失败)(附源码)

关于JAVA调用C的DLL库中的函数问题,传入一个含有指针的结构体指针

在托管 DLL 中加载 C++ DLL 时出现 EEFileLoadException