在屏幕保护程序中找不到DLL 'opengl32.dll'的入口点

4
我有一个非常奇怪的问题,关于我的C# OpenTK屏幕保护程序。当我编译程序并在更改扩展名之前运行它时,作为EXE文件,它可以正常工作。但是当我将扩展名更改为SCR并运行它时,它会崩溃,并出现System.EntryPointNotFound异常(在这种情况下为glCreateProgram函数)。在调试器中,我已经检查了如下内容:
作为EXE文件: GL.GetString(StringName.Vendor) ->“Intel” GL.GetString(StringName.Version) ->“2.1.0 - Build 8.15.10.2622”
作为SCR文件: GL.GetString(StringName.Vendor) ->“Microsoft” GL.GetString(StringName.Version) ->“1.1.0”
在我的应用程序中,我正在使用GameWindow类的无参数构造函数来创建OpenGL上下文。为了进行小实验,我将扩展名更改为BAT,并且它可以完美地运行。我不知道为什么我的OpenGL上下文取决于文件扩展名,我猜想屏幕保护程序是由系统在某种覆盖层上执行的,但实际上我找不到解决此问题的方法。
有什么建议吗?

这是一个 DLL 地狱问题,你的计算机上有多个 opengl32.dll 版本。当你将其重命名为 .scr 时,Windows 会找到另一个版本,毫无疑问是 c:\windows\system32 中的那个。 - Hans Passant
我检查了一下,发现我的电脑上有两个 opengl32.dll 库的副本 - 一个在 C:\Windows\System32\ 目录下,另一个在 C:\Windows\winsxs\ 目录下... 但是这两个文件都是相同版本的。 - mi_k
1
没错,那是微软版本。你还没有找到英特尔版本。显然,你的EXE程序可以找到它。启用非托管调试并查看调试+窗口+模块以查看其位置。 - Hans Passant
@mi_k:你应该始终使用在system32中找到的opengl32.dll。glCreateShader是一个扩展函数。OpenTK应该正确处理扩展加载。 - datenwolf
1个回答

1

最终,在长时间的搜索后,我发现英特尔阻止使用OpenGL的屏幕保护程序的硬件支持。我将扩展名更改为“sCr”以欺骗驱动程序,现在一切都正常了。

链接: opengl.org论坛


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接