MACRO OpenClass(P1,P2,P3) = P1 = CLASS P3:POKE DWORD, VARPTR(P1),P2: P1.AddRef
' Beispiel: OpenClass(E1,T01,"ThreadP")
' --- needed for pointer sanity checks (kernel32) ---
DECLARE FUNCTION IsBadReadPtr LIB "kernel32.dll" (BYVAL lp AS DWORD, BYVAL cb AS DWORD) AS LONG
' Returns 1 if p looks like a valid COM interface pointer (readable + readable vtbl)
FUNCTION PB_IsValidIFacePtr(BYVAL p AS DWORD) AS LONG
LOCAL pVtbl AS DWORD
FUNCTION = 0
IF p = 0 THEN EXIT FUNCTION
IF IsBadReadPtr(BYVAL p, 4) THEN EXIT FUNCTION
pVtbl = PEEK(DWORD, p)
IF pVtbl = 0 THEN EXIT FUNCTION
IF IsBadReadPtr(BYVAL pVtbl, 4) THEN EXIT FUNCTION
FUNCTION = 1
END FUNCTION
' P1 - Interfacevariable, P2 - Object pointer (Interface ptr), P3 - "ClassName"
' Safe: avoids crash on invalid pointer, avoids leaks
MACRO OpenClass(P1, P2, P3)
' Force PB to resolve class symbol; immediately release dummy instance to avoid leaks
P1 = CLASS P3
P1 = NOTHING
IF PB_IsValidIFacePtr(P2) THEN
POKE DWORD, VARPTR(P1), P2
P1.AddRef
END IF
END MACRO
.Page created in 0.113 seconds with 11 queries.