Я пытаюсь использовать некоторые 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)
Вы понимаете, что означает предупреждение? Если это так, вы поймете, что нам тоже нужно увидеть неуправляемое объявление. –
@DavidHeffernan gotcha, забыл об этом. – Matthew