81 lines
2.9 KiB
C
81 lines
2.9 KiB
C
// ole32.c - Win32 COM / OLE stubs
|
|
// No COM infrastructure at this stage; all functions fail gracefully.
|
|
#include <stdint.h>
|
|
#include <stddef.h>
|
|
#include <syscall.h>
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// 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;
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// 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;
|
|
}
|