"""Win32 API type description."""
-from base import *
+from stdapi import *
SHORT = Alias("SHORT", Short)
USHORT = Alias("USHORT", UShort)
LONGLONG = Alias("LONGLONG", LongLong)
FLOAT = Alias("FLOAT", Float)
-INT32 = Literal("INT32", "UInt")
+INT32 = Literal("INT32", "SInt")
UINT32 = Literal("UINT32", "UInt")
BYTE = Literal("BYTE", "UInt", base=16)
WORD = Literal("WORD", "UInt", base=16)
DWORD = Literal("DWORD", "UInt", base=16)
+
BOOL = Alias("BOOL", Bool)
LPLONG = Pointer(LONG)
LPWORD = Pointer(WORD)
LPDWORD = Pointer(DWORD)
LPBOOL = Pointer(BOOL)
-LPSIZE = LPDWORD
LPSTR = CString
LPCSTR = Const(CString)
(DWORD, "Data1"),
(WORD, "Data2"),
(WORD, "Data3"),
- (BYTE, "Data4[0]"),
- (BYTE, "Data4[1]"),
- (BYTE, "Data4[2]"),
- (BYTE, "Data4[3]"),
- (BYTE, "Data4[4]"),
- (BYTE, "Data4[5]"),
- (BYTE, "Data4[6]"),
- (BYTE, "Data4[7]"),
+ (Array(BYTE, "8"), "Data4"),
])
LPGUID = Pointer(GUID)
))
LPPOINT = Pointer(POINT)
+SIZE = Struct("SIZE", (
+ (LONG, "cx"),
+ (LONG, "cy"),
+))
+LPSIZE = Pointer(SIZE)
+
RECT = Struct("RECT", (
(LONG, "left"),
(LONG, "top"),
IUnknown = Interface("IUnknown")
+HRESULT_com = FakeEnum(HRESULT, [
+ "S_OK",
+ "E_NOINTERFACE",
+ "E_POINTER",
+])
+
IUnknown.methods = (
- Method(HRESULT, "QueryInterface", ((REFIID, "riid"), (Pointer(OpaquePointer(Void)), "ppvObj"))),
+ Method(HRESULT_com, "QueryInterface", ((REFIID, "riid"), Out(Pointer(OpaquePointer(Void)), "ppvObj"))),
Method(ULONG, "AddRef", ()),
Method(ULONG, "Release", ()),
)
-class DllFunction(Function):
-
- def get_true_pointer(self):
- ptype = self.pointer_type()
- pvalue = self.pointer_value()
- print ' if(!g_hDll) {'
- print ' g_hDll = LoadLibrary(g_szDll);'
- print ' if(!g_hDll)'
- self.fail_impl()
- print ' }'
- print ' if(!%s) {' % (pvalue,)
- print ' %s = (%s)GetProcAddress(g_hDll, "%s");' % (pvalue, ptype, self.name)
- print ' if(!%s)' % (pvalue,)
- self.fail_impl()
- print ' }'
-
-
-class Dll:
-
- def __init__(self, name):
- self.name = name
- self.functions = []
- if self not in towrap:
- towrap.append(self)
-
- def wrap_name(self):
- return "Wrap" + self.name
-
- def wrap_pre_decl(self):
- pass
-
- def wrap_decl(self):
- print 'static HINSTANCE g_hDll = NULL;'
- print 'static TCHAR g_szDll[MAX_PATH] = {0};'
- print
- print 'BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved);'
- print
- for function in self.functions:
- function.wrap_decl()
- print
-
- def wrap_impl(self):
- print r'BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {'
- print r' switch(fdwReason) {'
- print r' case DLL_PROCESS_ATTACH:'
- print r' if(!GetSystemDirectory(g_szDll, MAX_PATH))'
- print r' return FALSE;'
- print r' _tcscat(g_szDll, TEXT("\\%s.dll"));' % self.name
- print r' Log::Open("%s");' % self.name
- print r' case DLL_THREAD_ATTACH:'
- print r' return TRUE;'
- print r' case DLL_THREAD_DETACH:'
- print r' return TRUE;'
- print r' case DLL_PROCESS_DETACH:'
- print r' Log::Close();'
- print r' if(g_hDll) {'
- print r' FreeLibrary(g_hDll);'
- print r' g_hDll = NULL;'
- print r' }'
- print r' return TRUE;'
- print r' }'
- print r' (void)hinstDLL;'
- print r' (void)lpvReserved;'
- print r' return TRUE;'
- print r'}'
- print
- for function in self.functions:
- function.wrap_impl()
- print
-