【发布时间】:2021-12-30 04:17:02
【问题描述】:
我正在使用 LoadLibrary/GetProcAddress/wglGetProcAddress 在 C# 中加载 OpenGL。由于某种原因,它无法加载glBlendFunc 的指针,以及在那之后的其他随机指针。我一直在查看我的代码已经有一个小时的大部分时间了,所有这些失败的部分看起来都完全正常吗?
加载函数指针并将其转换为委托的代码。
public override T GetFunction<T>(string name)
{
IntPtr pointer = wglGetProcAddress(name);
if (pointer == IntPtr.Zero)
pointer = GetProcAddress(Handle, name);
return Marshal.GetDelegateForFunctionPointer<T>(pointer);
}
调用GetFunction的代码示例。
BlendEquationSeparate = Loader.GetFunction<glBlendEquationSeparate>("glBlendEquationSeparate");
BlendEquationSeparatei = Loader.GetFunction<glBlendEquationSeparatei>("glBlendEquationSeparatei");
BlendFunc = Loader.GetFunction<glBlendFunc>("glBlendFunc");
BlendFunci = Loader.GetFunction<glBlendFunci>("glBlendFunci");
BlendFuncSeparate = Loader.GetFunction<glBlendFuncSeparate>("glBlendFuncSeparate");
BlendFuncSeparatei = Loader.GetFunction<glBlendFuncSeparatei>("glBlendFuncSeparatei");
委托代码示例。
public delegate void glBlendEquationSeparate(BlendEquationMode modeRGB, BlendEquationMode modeAlpha);
public static glBlendEquationSeparate BlendEquationSeparate;
public delegate void glBlendEquationSeparatei(UInt32 buf, BlendEquationMode modeRGB, BlendEquationMode modeAlpha);
public static glBlendEquationSeparatei BlendEquationSeparatei;
public delegate void glBlendFunc(BlendingFactorSrc sfactor, BlendingFactorDest dfactor);
public static glBlendFunc BlendFunc;
public delegate void glBlendFunci(UInt32 buf, BlendingFactorSrc sfactor, BlendingFactorDest dfactor);
public static glBlendFunci BlendFunci;
public delegate void glBlendFuncSeparate(BlendingFactorSrc srcRGB, BlendingFactorDest dstRGB, BlendingFactorSrc srcAlpha, BlendingFactorDest dstAlpha);
public static glBlendFuncSeparate BlendFuncSeparate;
public delegate void glBlendFuncSeparatei(UInt32 buf, BlendingFactorSrc srcRGB, BlendingFactorDest dstRGB, BlendingFactorSrc srcAlpha, BlendingFactorDest dstAlpha);
public static glBlendFuncSeparatei BlendFuncSeparatei;
我正在使用的 DllImports
[DllImport("kernel32")]
public static extern IntPtr LoadLibrary(string fileName);
[DllImport("kernel32")]
public static extern IntPtr GetProcAddress(IntPtr module, string procName);
[DllImport("opengl32.dll", EntryPoint = "wglGetProcAddress", ExactSpelling = true)]
public static extern IntPtr wglGetProcAddress(string lpszProc);
所有的枚举都是非常标准的,不需要上下文。我像往常一样加载库:LoadLibrary(opengl32.dll);。谁能向我解释我哪里出错了?
【问题讨论】:
-
可能不是随机巧合:
glBlendFunc是通过GetProcAddress代码路径的函数之一(遗留函数由 opengl32.dll 直接导出)。GetProcAddress可能中断的一个原因是使用了错误的 dllimport,你能证明这一点吗? (值得注意的是,“GetProcAddressC#”在谷歌上的热门搜索突出显示了一种错误的 dllimport 方式) -
GetProcAddress可能会中断的另一种方法是将错误的句柄传递给它,所以你能否也显示该代码(你在这里显示了一些LoadLibrary调用,但这不是真正的代码,所以我不能确保实际代码做正确的事) -
@harold 我编辑了问题以包含 dllimports。
-
好吧,看起来不错。那么
Handle呢,你传入的是什么句柄呢? -
@harold 我传入了 LoadLibrary 返回的句柄,来自“opengl32.dll”。
标签: c# .net opengl .net-6.0 wgl