在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_OpenGL
为HMODULE
(在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] 删除。
我来说两句