3

以下 GetProcAddress 代码在 Delphi XE6 x64 下编译时失败。在 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.
4

1 回答 1

14

你的翻译是错误的。模块句柄是指针大小的,这解释了为什么您的错误翻译适用于 32 位而不是 64 位。

要更正,请将Windows单位添加到您的uses子句中,删除 and 的声明,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 的对话。

于 2014-08-29T22:05:46.297 回答