在Delphi XE6 x64下编译时,GetProcAddress无法运行

SOUser

在Delphi XE6 x64下编译时,以下GetProcAddress代码失败。在Delphi x86下编译时,它运行良好。您能帮忙评论一下做错了什么吗?

program Project11;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  SysUtils;

var
  Library_OpenGL: LongWord;

function LoadLibrary(lpFileName: pAnsiChar): LongWord; stdcall; external 'kernel32.dll' name 'LoadLibraryA';
function GetProcAddress(hModule: LongWord; lpProcName: pAnsiChar): Pointer; stdcall; external 'kernel32.dll' name 'GetProcAddress';

begin
  try
    Library_OpenGL := LoadLibrary('opengl32.dll');
    Assert(GetProcAddress(Library_OpenGL, 'glEnable') <> nil, 'GetProcAddress(Library_OpenGL, ''glEnable'') = nil');
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  ReadLn;
end.
瑟塔克·阿奎兹

您的翻译是错误的。模块句柄的大小与指针大小相同,这说明了为什么您的错误翻译只能在32位而不是64位上工作。

要更正,请将Windows单元添加到您的uses子句中,删除对LoadLibrary()的声明GetProcAddress(),然后声明Library_OpenGLHMODULE(在x64中为8个字节):

program Project11;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  SysUtils, Windows;

var
  Library_OpenGL: HMODULE;

begin
  try
    Library_OpenGL := LoadLibrary('opengl32.dll');
    Assert(GetProcAddress(Library_OpenGL, 'glEnable') <> nil, 'GetProcAddress(Library_OpenGL, ''glEnable'') = nil');
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  ReadLn;
end.

另外一个好处是,您现在LoadLibraryW直接调用本机Unicode ,而不是通过LoadLibraryA适配器将其从ANSI到系统本机UTF-16的对话传递出去。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章