P/Invoking "wglChoosePixelFormatARB" 堆栈失衡
P/Invoking "wglChoosePixelFormatARB" Unbalances the Stack
我正在尝试使用一些 pinvoke 为某些单元测试设置 wgl 上下文,但是(到目前为止)我的一种方法使堆栈不平衡。
我所做的是先创建一个window并获得它的DC。当我与 kernel32、user32、gdi32 库交谈时,这一切都有效。我想用 OpenGL 绘制到 pbuffer,为了创建 PB,我需要使用扩展。这需要我有一个上下文......很遗憾,这一切都很正常并且到目前为止工作。
当我尝试创建 pbuffer 时出现问题。当我尝试使用 wglChoosePixelFormatARB
获取配置时,这似乎使堆栈不平衡。我刚刚执行了另一个 ARB 方法 (wglGetExtensionsStringARB
) 来检查扩展 - 使用相同的父 DC 可以正常工作。
所以,开始编写代码...我的委托如下所示:
[UnmanagedFunctionPointer(CallingConvention.Winapi)]
[return: MarshalAs(UnmanagedType.Bool)]
public delegate bool wglChoosePixelFormatARBDelegate(
IntPtr dc,
[In] int[] attribIList,
[In] float[] attribFList,
uint maxFormats,
[Out] int[] pixelFormats,
out uint numFormats);
我觉得是这样的:
[DllImport(opengl32)]
public static extern IntPtr wglGetProcAddress(string lpszProc);
// ...
var ptr = wglGetProcAddress("wglCreatePbufferARB");
wglCreatePbufferARB = Marshal.GetDelegateForFunctionPointer(ptr, typeof(wglChoosePixelFormatARBDelegate));
我是这样调用它的:
var iAttrs = new int[]
{
Wgl.WGL_ACCELERATION_ARB, Wgl.WGL_FULL_ACCELERATION_ARB,
Wgl.WGL_DRAW_TO_WINDOW_ARB, Wgl.TRUE,
Wgl.WGL_SUPPORT_OPENGL_ARB, Wgl.TRUE,
Wgl.NONE, Wgl.NONE
};
var fAttrs = new float[2];
var piFormats = new int[1];
uint nFormats;
wglChoosePixelFormatARB(
parentDC,
iAttrs,
fAttrs,
(uint)piFormats.Length,
piFormats,
out nFormats);
if (nFormats == 0)
{
return IntPtr.Zero;
}
var pbuf = extensions.wglCreatePbufferARB(parentDC, piFormats[0], 1, 1, null);
本机端是(未导出):
BOOL WINAPI wglChoosePixelFormatARB (
HDC hdc,
const int *piAttribIList,
const FLOAT *pfAttribFList,
UINT nMaxFormats,
int *piFormats,
UINT *nNumFormats);
函数 def 是这样的:
typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATARBPROC) (
HDC hdc,
const int *piAttribIList,
const FLOAT *pfAttribFList,
UINT nMaxFormats,
int *piFormats,
UINT *nNumFormats);
我觉得代码没问题,但肯定有问题:) 希望有人能指出我的错误。
如果需要更多代码,我将所有代码都放在一个文件中,它只是一个普通的控制台应用程序:
https://gist.github.com/mattleibow/755eba3c8ff5eafb9549842a0abb0426
(代码有大块注释,这只是因为我正忙于从 C++ 移植到 C#。三分之一的代码只是 dllimports/structs/enums)
函数声明看起来合理,但似乎只是导入了错误的函数。
你想要 wglChoosePixelFormatARB
但实际上导入 wglCreatePbufferARB
。这闻起来像 class copy/paste SNAFU。
通过更正您传递给 GetProcAddress
的名称来解决此问题。
我正在尝试使用一些 pinvoke 为某些单元测试设置 wgl 上下文,但是(到目前为止)我的一种方法使堆栈不平衡。
我所做的是先创建一个window并获得它的DC。当我与 kernel32、user32、gdi32 库交谈时,这一切都有效。我想用 OpenGL 绘制到 pbuffer,为了创建 PB,我需要使用扩展。这需要我有一个上下文......很遗憾,这一切都很正常并且到目前为止工作。
当我尝试创建 pbuffer 时出现问题。当我尝试使用 wglChoosePixelFormatARB
获取配置时,这似乎使堆栈不平衡。我刚刚执行了另一个 ARB 方法 (wglGetExtensionsStringARB
) 来检查扩展 - 使用相同的父 DC 可以正常工作。
所以,开始编写代码...我的委托如下所示:
[UnmanagedFunctionPointer(CallingConvention.Winapi)]
[return: MarshalAs(UnmanagedType.Bool)]
public delegate bool wglChoosePixelFormatARBDelegate(
IntPtr dc,
[In] int[] attribIList,
[In] float[] attribFList,
uint maxFormats,
[Out] int[] pixelFormats,
out uint numFormats);
我觉得是这样的:
[DllImport(opengl32)]
public static extern IntPtr wglGetProcAddress(string lpszProc);
// ...
var ptr = wglGetProcAddress("wglCreatePbufferARB");
wglCreatePbufferARB = Marshal.GetDelegateForFunctionPointer(ptr, typeof(wglChoosePixelFormatARBDelegate));
我是这样调用它的:
var iAttrs = new int[]
{
Wgl.WGL_ACCELERATION_ARB, Wgl.WGL_FULL_ACCELERATION_ARB,
Wgl.WGL_DRAW_TO_WINDOW_ARB, Wgl.TRUE,
Wgl.WGL_SUPPORT_OPENGL_ARB, Wgl.TRUE,
Wgl.NONE, Wgl.NONE
};
var fAttrs = new float[2];
var piFormats = new int[1];
uint nFormats;
wglChoosePixelFormatARB(
parentDC,
iAttrs,
fAttrs,
(uint)piFormats.Length,
piFormats,
out nFormats);
if (nFormats == 0)
{
return IntPtr.Zero;
}
var pbuf = extensions.wglCreatePbufferARB(parentDC, piFormats[0], 1, 1, null);
本机端是(未导出):
BOOL WINAPI wglChoosePixelFormatARB (
HDC hdc,
const int *piAttribIList,
const FLOAT *pfAttribFList,
UINT nMaxFormats,
int *piFormats,
UINT *nNumFormats);
函数 def 是这样的:
typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATARBPROC) (
HDC hdc,
const int *piAttribIList,
const FLOAT *pfAttribFList,
UINT nMaxFormats,
int *piFormats,
UINT *nNumFormats);
我觉得代码没问题,但肯定有问题:) 希望有人能指出我的错误。
如果需要更多代码,我将所有代码都放在一个文件中,它只是一个普通的控制台应用程序: https://gist.github.com/mattleibow/755eba3c8ff5eafb9549842a0abb0426
(代码有大块注释,这只是因为我正忙于从 C++ 移植到 C#。三分之一的代码只是 dllimports/structs/enums)
函数声明看起来合理,但似乎只是导入了错误的函数。
你想要 wglChoosePixelFormatARB
但实际上导入 wglCreatePbufferARB
。这闻起来像 class copy/paste SNAFU。
通过更正您传递给 GetProcAddress
的名称来解决此问题。