// ole32.c - Win32 COM / OLE stubs // No COM infrastructure at this stage; all functions fail gracefully. #include #include // --------------------------------------------------------------------------- // Types // --------------------------------------------------------------------------- typedef long HRESULT; typedef void* IUnknown; #define S_OK ((HRESULT)0x00000000L) #define E_NOTIMPL ((HRESULT)0x80004001L) #define E_OUTOFMEMORY ((HRESULT)0x8007000EL) #define COINIT_MULTITHREADED 0x0 // GUID - 16-byte COM interface identifier. typedef struct { unsigned int Data1; unsigned short Data2; unsigned short Data3; unsigned char Data4[8]; } GUID; // PROPVARIANT - variant type used by shell / media APIs. typedef struct { unsigned short vt; unsigned short wReserved1, wReserved2, wReserved3; union { long long hVal; double dblVal; void* punkVal; unsigned char bVal; unsigned int ulVal; // ... (only common fields; full union is ~16 bytes) unsigned char padding[16]; }; } PROPVARIANT; extern void SysFree(void* ptr, size_t size); // --------------------------------------------------------------------------- // COM initialisation // --------------------------------------------------------------------------- __declspec(dllexport) HRESULT CoInitializeEx(void* reserved, unsigned long coInit) { (void)reserved; (void)coInit; return S_OK; // Pretend success; no actual apartment is created. } __declspec(dllexport) void CoUninitialize(void) { // No-op. } // --------------------------------------------------------------------------- // Object creation // --------------------------------------------------------------------------- __declspec(dllexport) HRESULT CoCreateInstance(const GUID* clsid, IUnknown* outer, unsigned long ctx, const GUID* iid, void** ppv) { (void)clsid; (void)outer; (void)ctx; (void)iid; if (ppv) *ppv = (void*)0; return E_NOTIMPL; } // --------------------------------------------------------------------------- // Memory // --------------------------------------------------------------------------- __declspec(dllexport) void CoTaskMemFree(void* pv) { if (pv) SysFree(pv, 0); } // --------------------------------------------------------------------------- // PROPVARIANT // --------------------------------------------------------------------------- __declspec(dllexport) HRESULT PropVariantClear(PROPVARIANT* pvar) { if (!pvar) return E_NOTIMPL; // Zero the entire structure; no deep release needed for stub types. unsigned char* p = (unsigned char*)pvar; for (size_t i = 0; i < sizeof(*pvar); i++) p[i] = 0; return S_OK; }