以下代码尝试加载OpenGL glGenBuffers方法但未能这样做.你能帮忙评论一下是什么原因以及如何解决这个问题?
program Project2;
{$APPTYPE CONSOLE}
{$R *.res}
uses
StrUtils, SysUtils, Windows;
var
Library_OpenGL: HMODULE;
begin
try
Library_OpenGL := LoadLibrary('opengl32.dll');
Writeln(Ifthen(GetProcAddress(Library_OpenGL, 'glGenBuffers') <> nil, ' glGenBuffers Success', ' glGenBuffers Failed'));
Writeln(Ifthen(GetProcAddress(Library_OpenGL, 'glGenBuffersARB') <> nil, ' glGenBuffersARB Success', ' glGenBuffersARB Failed'));
FreeLibrary(Library_OpenGL);
Library_OpenGL := LoadLibrary('atioglxx.dll'); // ATI 4850
Writeln(Ifthen(GetProcAddress(Library_OpenGL, 'glGenBuffers') <> nil, ' glGenBuffers Success', ' glGenBuffers Failed'));
Writeln(Ifthen(GetProcAddress(Library_OpenGL, 'glGenBuffersARB') <> nil, ' glGenBuffersARB Success', ' glGenBuffersARB Failed'));
FreeLibrary(Library_OpenGL);
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
ReadLn;
end.
Run Code Online (Sandbox Code Playgroud)
如果我们正确地检查API的返回,而不是在它失败时转储,我们得到它失败的原因的答案.
更换
Writeln(Ifthen(GetProcAddress(Library_OpenGL, 'glGenBuffers') <> nil, ' glGenBuffers Success', ' glGenBuffers Failed'));
Run Code Online (Sandbox Code Playgroud)
同
Win32Check(GetProcAddress(Library_OpenGL, 'glGenBuffers') <> nil);
Run Code Online (Sandbox Code Playgroud)
我们有一个例外:
EOSError:系统错误.代码:127
.找不到指定的程序
因此GetProcAddress失败的原因是opengl库不导出glGenBuffers函数."依赖"检查确认了这一点.
快速搜索opengl中缺少的函数会导致我们wglGetProcAddress:
该wglGetProcAddress函数返回与当前的OpenGL渲染上下文使用OpenGL扩展函数的地址.
如果你仔细阅读文档,你会发现只是调用gwlGetProcAddress提供glGenBuffers将失败.您需要一个渲染上下文来返回函数的地址.
下面是我获得函数地址的最短项目.它使用GUI应用程序,因为渲染上下文需要一个窗口,默认的VCL表单符合要求(参见"备注" SetPixelFormat).(免责声明:我对opengl一无所知,下面的代码不一定正确,它也省略了你应该真正避免的错误检查).
uses
opengl;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
Library_OpenGL: HMODULE;
DC: HDC;
PxFmt: TPixelFormatDescriptor;
GLRC: HGLRC;
glGenBuffers: procedure(n: GLsizei; buffers: PGLuint); cdecl;
begin
Library_OpenGL := LoadLibrary('opengl32.dll');
DC := GetDC(Handle);
ZeroMemory(@PxFmt, SizeOf(PxFmt));
PxFmt.nSize := SizeOf(PxFmt);
PxFmt.nVersion := 1;
PxFmt.dwFlags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
PxFmt.iPixelType := PFD_TYPE_RGBA;
PxFmt.cColorBits := 32;
PxFmt.cDepthBits := 24;
PxFmt.cStencilBits := 8;
SetPixelFormat(DC, ChoosePixelFormat(DC, @PxFmt), @PxFmt);
GLRC := wglCreateContext(DC);
wglMakeCurrent(DC, GLRC);
@glGenBuffers := wglGetProcAddress('glGenBuffers');
Assert(@glGenBuffers <> nil);
...
end;
Run Code Online (Sandbox Code Playgroud)