module activex; /*************************************************************** * $HeadURL$ * $Revision$ * $Date$ * $Author$ */ private: import std.array; /* for ArrayBoundsError */ import std.stdarg; import std.string; import std.utf; import std.stdio; /* for writefln */ import win32.api; import win32.com.oaidl; /* for VARIANTARG */ pragma(lib, "win32.lib"); pragma(lib, "uuid.lib"); pragma(lib, "ole32.lib"); /* for _CLSIDFromProgID@8, _CoCreateInstance@20, _CoInitialize@4, _CoUninitialize@0 */ pragma(lib, "oleaut32.lib"); /* for _SysFreeString@4, _SysAllocString@4 */ public: class AXO { private static LCID defaultLCID; static this() { defaultLCID = GetUserDefaultLCID(); CoInitialize(null); } static ~this() { CoUninitialize(); } struct MemberDef { char [] name; DISPID dispid; INVOKEKIND invkind; FUNCDESC * pFuncDesc; } private ITypeInfo [FUNCDESC *] allFuncDescs; private ITypeInfo typeInfo; private IDispatch pIDispatch; private MemberDef [] allMembers; private char[] [ DISPID ] methods; private char[] [ DISPID ] getters; private SHORT [ DISPID ] returns; private char[] [ DISPID ] setters; private char[] [ DISPID ] settersbyref; this(char [] appName) { const(wchar)* prog = toUTF16z(appName); CLSID clsid; HRESULT hr = CLSIDFromProgID(cast(wchar*)prog, &clsid); hr = CoCreateInstance(&clsid, null, CLSCTX_SERVER, &IID_IDispatch, cast(void**)&pIDispatch); loadMembers(); } ~this() { foreach ( const(FUNCDESC) * pFuncDesc, ITypeInfo ti; allFuncDescs) ti.ReleaseFuncDesc(cast(FUNCDESC *)pFuncDesc); } void loadMembers() { HRESULT hr = pIDispatch.GetTypeInfo(0,defaultLCID, &typeInfo); loadMembers(typeInfo); } void loadMembers(ITypeInfo pTypeInfo) { TYPEATTR * pTypeAttr; HRESULT hr = pTypeInfo.GetTypeAttr(&pTypeAttr); for(uint i;i