2014-08-29 1 views
1

다음 GetProcAddress 코드는 Delphi XE6 x64에서 컴파일 할 때 실패합니다. 델파이 x86에서 컴파일하면 잘 돌아갑니다. 잘못된 것이 무엇인지 논평하는 데 도움을 줄 수 있습니까?Delphi XE6 x64에서 컴파일 할 때 GetProcAddress가 실행되지 않습니다.

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. 
+0

64 비트 프로세스가 명백하게 32 비트 DLL을로드 할 수 있다고 상상할 수 없습니다. 그것은 실패 할 의무가 있습니다. –

+0

@Rudy, 32 비트 및 64 비트 DLL은 모두 opengl32로 명명됩니다. 하나는 system32에, 다른 하나는 syswow64에 있습니다. –

+0

@Ah, Ok, 감사합니다. 왜 지구상에 opengl64라고 부르지 않습니까? –

답변

13

번역이 잘못되었습니다. 모듈 핸들은 잘못된 번역이 32 비트에서 작동하지만 64 비트에서 작동하지 않는 이유를 설명하는 포인터 크기입니다. 해결하려면

은, 당신의 uses 절에 Windows 장치를 추가 LoadLibrary()GetProcAddress() 당신의 선언을 제거하고 (8 64 바이트입니다) HMODULELibrary_OpenGL를 선언 : 추가 혜택으로

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. 

당신 이제는 기본 유니 코드 인 LoadLibraryWLoadLibraryA 어댑터를 통해 ANSI에서 시스템 고유 UTF-16 대화로 이동하는 대신 직접 호출하십시오.

+0

실제로 작동하는 것 같습니다. –

+0

@SertacAkyuz 도움 주신 의견을 보내 주셔서 감사합니다. – SOUser

관련 문제