You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Inno Setup中OpenGL版本检测问题:函数指针调用及编译报错

解决Inno Setup中检测OpenGL版本的函数调用问题

原代码的核心问题

  1. 函数归属DLL错误:gluGetString是glu32.dll导出的函数,不是opengl32.dll,直接声明到错误DLL会导致运行时找不到函数(对应你截图里的错误)。
  2. 函数指针赋值语法错误:Inno Setup Pascal Script不支持@变量 := 返回值的写法,需要把GetProcAddress返回的LongWord强制转换为函数指针类型。

修正后的完整代码

// 声明系统API函数
function LoadLibrary(lpLibFileName: string): THandle;
  external 'LoadLibrary{#AW}@kernel32.dll stdcall';
function GetProcAddress(hModule: THandle; lpProcName: string): LongWord;
  external 'GetProcAddress@kernel32.dll stdcall';
function FreeLibrary(hModule: THandle): BOOL;
  external 'FreeLibrary@kernel32.dll stdcall';

// 定义函数指针类型,和gluGetString的签名匹配
type
  TgluGetString = function(Name: Cardinal): PAnsiChar; stdcall;

function GetOpenGLVersion: string;
var
  hGluLib: THandle;
  gluGetStringFunc: TgluGetString;
  VersionPtr: PAnsiChar;
begin
  Result := '';
  // 加载glu32.dll(系统目录下)
  hGluLib := LoadLibrary(ExpandConstant('{sys}\glu32.dll'));
  if hGluLib <> 0 then
  begin
    // 将GetProcAddress返回的地址转换为函数指针
    gluGetStringFunc := TgluGetString(GetProcAddress(hGluLib, 'gluGetString'));
    if Assigned(gluGetStringFunc) then
    begin
      // GL_VERSION的常量值是$1F02
      VersionPtr := gluGetStringFunc($1F02);
      if VersionPtr <> nil then
      begin
        Result := string(VersionPtr);
        MsgBox('OpenGL版本:' + Result, mbInformation, MB_OK);
      end
      else
        MsgBox('无法获取OpenGL版本信息', mbError, MB_OK);
    end
    else
      MsgBox('无法获取gluGetString函数地址', mbError, MB_OK);
    // 记得释放加载的库
    FreeLibrary(hGluLib);
  end
  else
    MsgBox('无法加载glu32.dll', mbError, MB_OK);
end;

关键说明

  • DLL路径处理:用ExpandConstant('{sys}')获取系统目录,避免硬编码路径导致兼容性问题。
  • 函数指针类型定义:必须显式声明stdcall调用约定,和原函数的调用约定一致,否则会导致栈错误。
  • 资源释放:加载DLL后必须调用FreeLibrary释放,避免内存泄漏。
  • 错误处理:每一步都加判断,方便定位问题(比如加载DLL失败、获取函数地址失败、获取版本失败等)。

如果要直接通过external声明调用,也可以修正DLL名称:

function gluGetString(Name: Cardinal): PAnsiChar;
  external 'gluGetString@glu32.dll stdcall';

但这种方式的问题是,如果系统里没有glu32.dll(极少数情况),安装程序会直接崩溃,而动态加载的方式可以优雅处理错误。

内容的提问来源于stack exchange,提问作者eular

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 17:55:21