C++ 如何读取特定于windows的扩展

C++ 如何读取特定于windows的扩展,c++,opengl,C++,Opengl,在OpenGL superbible中,示例说明我可以通过以下方式读取Windows特定扩展: //Type defined in the book as char, but that is not what glGetString returns... const GLubyte *extensions = glGetString(GL_EXTENSIONS); if(strstr(extensions, "WGL_EXT_swap_control") != NULL) { wglSw

在OpenGL superbible中,示例说明我可以通过以下方式读取Windows特定扩展:

//Type defined in the book as char, but that is not what glGetString returns...
const GLubyte *extensions = glGetString(GL_EXTENSIONS);
if(strstr(extensions, "WGL_EXT_swap_control") != NULL)
{
    wglSwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC)wglGetProcAddress("wglSwapIntervalEXT");
    if(wglSwapIntervalEXT != NULL)
        wglSwapIntervalEXT(1);
}

strstr
不接受
GLubyte
。如何实现这一点?

您可以将
glGetString
的返回值强制转换为常量字符指针,并使用您最喜欢的字符串处理函数

但实际上,我建议使用库,例如用于管理扩展。

glGetString(GL_扩展)
将返回视频卡支持的大多数扩展(以空格分隔)。但是,此调用不包括windows特定的WGL\uuz扩展(适用于OpenGL 3.0+版)。您还需要调用
wglGetExtensionsString(HDC)
,以获得该卡支持的其余WGL扩展

下面是一段代码片段(您可以删除ARB后缀):


只需将
glGetString
的返回值强制转换为
const char*
。我尝试了这一操作,得到了“block.exe中0x77e315de处未处理的异常:0xC0000005:访问冲突读取位置0x00000000。”因为
glGetString
返回了空指针。我猜你是在初始化OpenGL之前或从其他线程调用它(不太可能)。@user786653-你是对的。这解决了问题。你应该把答案贴出来,这样我就可以给你评分了。我现在还在学习基础知识。最终,我会按照你的建议使用一个图书馆。使用GLEW会让你的生活更轻松,而且你不需要学习在99%的情况下没有什么用处的东西。而且,您不会错误地学习它们(关于WGL的正确答案是song提供的答案)。
#include <windows.h>
#include <iostream>
#include <GL/gl.h>

// function ptr: WGL specific extensions for v3.0+
typedef const char* (WINAPI * PFNWGLGETEXTENSIONSSTRINGARBPROC)(HDC hdc);
PFNWGLGETEXTENSIONSSTRINGARBPROC  pwglGetExtensionsStringARB = 0;
#define wglGetExtensionsStringARB pwglGetExtensionsStringARB
...

// get WGL specific extensions for v3.0+
wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)wglGetProcAddress("wglGetExtensionsStringARB");
if(wglGetExtensionsStringARB)
{
    const char* str = wglGetExtensionsStringARB(hdc);
    if(str)
    {
        std::cout << str << std::endl;
    }
}
HDC hdc = ::GetDC(hwnd);