P/Invoking "wglChoosePixelFormatARB" разбалансирует стек

Я пытаюсь использовать некоторые пинвоки для настройки контекста wgl для некоторых модульных тестов, но (пока) один из моих методов разбалансирует стек.

Я сначала создал окно и получил его DC. Все это работает, как я говорю с библиотеками kernel32, user32, gdi32. Я хочу нарисовать в pbuffer с OpenGL, и для создания 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)

1 ответ

Решение

Объявление функции выглядит разумно, но кажется, что вы просто импортируете не ту функцию.

Ты хочешь wglChoosePixelFormatARB но на самом деле импорт wglCreatePbufferARB, Это пахнет как класс копирования / вставки SNAFU.

Исправьте это, исправив имя, которое вы передаете GetProcAddress,

Другие вопросы по тегам