2017-02-15 18 views
0

Я пытаюсь использовать некоторые pinvokes для настройки wgl-контекста для некоторых модульных тестов, но (пока) один из моих методов разбалансирует стек.P/Invoking «wglChoosePixelFormatARB» Разбалансирует стек

Что я сделал, это сначала создать окно и получить его 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); 

А функция четкости такова:

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)

+0

Вы понимаете, что означает предупреждение? Если это так, вы поймете, что нам тоже нужно увидеть неуправляемое объявление. –

+0

@DavidHeffernan gotcha, забыл об этом. – Matthew

ответ

2

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

Вы хотите wglChoosePixelFormatARB, но на самом деле импорт wglCreatePbufferARB. Это пахнет классом copy/paste SNAFU.

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

+0

Серьезно? Я проверил все, кроме строки штопа? Это было в течение нескольких часов ... Спасибо! Похоже, мне действительно нужен этот сон. http://m.memegen.com/qis49q.jpg – Matthew

 Смежные вопросы

  • Нет связанных вопросов^_^