2017-02-15 138 views
0

我想使用一些pinvokes为某些单元测试设置wgl上下文,但是(到目前为止)我的方法之一不平衡堆栈。P /调用“wglChoosePixelFormatARB”不平衡堆栈

我所做的是先创建一个窗口并获得其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); 

代码看起来OK我,但一定是有什么错:)我希望有人能指出我的错误。

如果需要更多的代码,我在这里有它在一个单一的文件,该文件只是一个简单的控制台应用程序: https://gist.github.com/mattleibow/755eba3c8ff5eafb9549842a0abb0426

(代码有意见大块,这仅仅是因为我从C++到C#的繁忙移植,以及三分之一的代码只是dllimports/structs/enums)

+0

你明白警告的含义吗?如果是这样,那么你会意识到我们也需要看到非托管声明。 –

+0

@DavidHeffernan陷入困境,忘了这一点。 – Matthew

回答

2

函数声明看起来很合理,但看起来你只是简单地导入了错误的函数。

想要wglChoosePixelFormatARB但实际导入wglCreatePbufferARB。这闻起来像一个班复制/粘贴SNAFU。

通过更正您传递给GetProcAddress的名称来解决此问题。

+0

认真吗?我检查了一切,但织物字符串?已经在这里几个小时了......谢谢!看起来我确实需要睡眠。 http://m.memegen.com/qis49q.jpg – Matthew