2016-07-28 34 views
0

Ich habe die ANGLE dlls für eine Weile verwendet, um OpenGLES2.0-Code unter Windows von 32-Bit-Python (pi3d-Modul) auszuführen, aber ich kann es nicht mit 64 arbeiten Bits. Ich habe compiled the libraries und in einem Stadium, auf einem anderen Laptop, zu dem ich jetzt keinen Zugang habe, ist es weiter gekommen. Dies ist eine abgespeckte Version des Codes, der den Punkt reproduziert, an dem er momentan stoppt.eglInitialize Fehler mit ANGLE dll von Python 64 Bit

import ctypes 
import pygame 
import os 

EGL_DEFAULT_DISPLAY = 0 
EGL_NO_DISPLAY = 0 
EGL_TRUE = 1 

pygame.init() 
d = pygame.display.set_mode((0, 0), pygame.DOUBLEBUF | pygame.RESIZABLE | pygame.OPENGL) 
info = pygame.display.Info() 
width, height = info.current_w, info.current_h 

#path = "C:/Program Files (x86)/Google/Chrome/Application/42.0.2311.152" 
#path = "C:\\Program Files (x86)\\Google\Chrome\\Application\\42.0.2311.135" 
path = "" # compiled ANGLE dll files in same directory 
d3dcompiler = ctypes.WinDLL(os.path.join(path, "d3dcompiler_47.dll")) 
opengles = ctypes.WinDLL(os.path.join(path, "libglesv2.dll")) 
openegl = ctypes.WinDLL(os.path.join(path, "libegl.dll")) 
display = openegl.eglGetDisplay(EGL_DEFAULT_DISPLAY) 
assert display != EGL_NO_DISPLAY #<<<<<<<<<<<<<<<<<<<<<< 
r = openegl.eglInitialize(display, None, None) 
print('eglInitialize() returned {}'.format(r)) 
assert r == EGL_TRUE    #<<<<<<<<<<<<<<<<<<<<<< 

Antwort

1

wahrscheinlich eine 32-Bit-Ganzzahl wird als Argument oder erwartet als Typ für den zurückgegebenen Wert statt einer 64-Bit-Ganzzahl ohne Vorzeichen gegeben. Dies geschieht häufig für Zeigerwerte (Handles), da 64-Bit-Fenster 32-Bit-Ganzzahlen und 64-Bit-Zeiger haben. Die Definition der Attribute argtypes und restypes kann helfen oder zumindest helfen, die Probleme zu erkennen.

import ctypes.wintypes as wt 

openegl.elgGetDisplay.argtypes = [wt.HDC] 
openegl.elgGetDisplay.restype = c_void_p 

openegl.eglInitialize.argtypes = [c_void_p, POINTER(c_int32), POINTER(c_int32)] 
openegl.eglInitialize.restype = c_uint 

dann

display = openegl.eglGetDisplay(None) 
assert display.value is not None 
r = openegl.eglInitialize(display, None, None) 

funktionieren könnte (ich, dass Bibliothek installiert haben nicht so kann ich nicht überprüfen).

+0

Danke für diese Hilfe. Das hat den Trick gemacht. Die liberale Spezifikation von Argtypen mit Void-Zeigern funktioniert auf 64-Bit-Fenstern. Ich muss nur überprüfen, dass es immer noch auf einem 32-Bit-System funktioniert. (Anmerkung zu sich selbst: in Zukunft Stack-Overflow etwas früher nutzen) – paddyg