こんにちは。まずはこちらをご覧下さい。
TLB2IDL
https://github.com/katahiromz/tlb2idl
これは現在作成中のWin32のタイプライブラリファイル(*.tlb
)をMIDLファイルに変換するプログラムです。開発環境はWindows10とMSYS2とMSVCです。言語はC++/Win32です。
主な処理は、
https://github.com/katahiromz/tlb2idl/blob/main/CTypeLib.hpp
https://github.com/katahiromz/tlb2idl/blob/main/CTypeLib.cpp
の2つで行っていますが、システムにあるstdole2.tlb
を処理したところ、
txt
1 [ 2 uuid(7BF80980-BF32-101A-8BBB-00AA00300CAB), 3 helpstring("Picture Object"), 4 hidden 5 ] 6 interface IPicture : ... { 7 [id(0x60010000), propget, {{1,0,0}}] 8 HRESULT Handle([out, retval] OLE_HANDLE* phandle);
のようにスーパークラスを表示することができません(ここではIPicture
のスーパークラス)。
CTypeLib.cpp
のCTypeLibFunc::Load
でスーパークラスの情報を取得する方法を教えて下さい。
ITypeInfo::GetDocument
やITypeInfo::GetRefTypeOfImplType
など、あれこれ試しましたが、結局、スーパークラスを取得する方法は分かりませんでした。ただ、実装型のImplType
が1個あるのは分かりました。ImplType
から情報を取得しようとしましたが、難しいようです。
cpp
1HRESULT CTypeLibFunc::Load(ITypeInfo *pTypeInfo, FUNCDESC *pFuncDesc) 2{ 3 m_funckind = pFuncDesc->funckind; 4 m_invkind = pFuncDesc->invkind; 5 m_memid = pFuncDesc->memid; 6 m_cParams = pFuncDesc->cParams; 7 m_cParamsOpt = pFuncDesc->cParamsOpt; 8 m_oVft = pFuncDesc->oVft; 9 m_cScodes = pFuncDesc->cScodes; 10 m_wFuncFlags = pFuncDesc->wFuncFlags; 11 m_callconv = pFuncDesc->callconv; 12 m_typedesc = getStringOfTypeDesc(pTypeInfo, &pFuncDesc->elemdescFunc.tdesc); 13 14 const UINT cNames = 64; 15 UINT cGotNames; 16 BSTR bstrNames[cNames] = { NULL }, bstrHelpString = NULL; 17 DWORD dwHelpContext = 0; 18 19 pTypeInfo->GetNames(pFuncDesc->memid, bstrNames, cNames, &cGotNames); 20 pTypeInfo->GetDocumentation(pFuncDesc->memid, NULL, &bstrHelpString, &dwHelpContext, NULL); 21 22 BSTR bstrDllName = NULL, bstrEntry = NULL; 23 WORD wOrdinal = 0; 24 pTypeInfo->GetDllEntry(pFuncDesc->memid, m_invkind, &bstrDllName, &bstrEntry, &wOrdinal); 25 m_dllname = sz_or_empty(bstrDllName); 26 m_entry = sz_or_empty(bstrEntry); 27 m_wOrdinal = wOrdinal; 28 SysFreeString(bstrDllName); 29 SysFreeString(bstrEntry); 30 31 if (bstrNames[0]) 32 { 33 m_name = sz_or_empty(bstrNames[0]); 34 } 35 36 if (bstrHelpString) 37 { 38 m_helpstring = sz_or_empty(bstrHelpString); 39 SysFreeString(bstrHelpString); 40 } 41 m_dwHelpContext = dwHelpContext; 42 43 m_cParams = pFuncDesc->cParams; 44 m_cParamsOpt = pFuncDesc->cParamsOpt; 45 for (UINT iParam = 0; iParam < (UINT)m_cParams; ++iParam) 46 { 47 std::wstring name; 48 if (iParam + 1 < cGotNames) 49 name = sz_or_empty(bstrNames[iParam + 1]); 50 if (name.empty()) 51 name = getNewIdentifier(); 52 m_param_names.push_back(name); 53 54 auto pElemDesc = &pFuncDesc->lprgelemdescParam[iParam]; 55 56 auto attrs = getStringOfParamDesc(pTypeInfo, &pElemDesc->paramdesc); 57 m_param_attrs.push_back(attrs); 58 59 auto type = getStringOfTypeDesc(pTypeInfo, &pElemDesc->tdesc); 60 m_param_types.push_back(type); 61 } 62 63 if (m_cParamsOpt == 0) 64 { 65 ; 66 } 67 else if (m_cParamsOpt == -1) 68 { 69 m_param_names.push_back(L""); 70 m_param_attrs.push_back(L""); 71 m_param_types.push_back(L"..."); 72 } 73 74 if (m_invkind == INVOKE_PROPERTYGET) 75 { 76 if (m_typedesc != L"HRESULT") 77 { 78 m_param_attrs.insert(m_param_attrs.end(), L"[out, retval]"); 79 m_param_types.insert(m_param_types.end(), m_typedesc + L"*"); 80 m_param_names.insert(m_param_names.end(), getNewIdentifier()); 81 m_typedesc = L"HRESULT"; 82 } 83 } 84 if (m_typeflags & TYPEFLAG_FOLEAUTOMATION) 85 { 86 if (m_typedesc == L"VOID") 87 { 88 m_typedesc = L"HRESULT"; 89 } 90 else if (m_typedesc == L"VARIANT" || m_typedesc == L"BSTR") 91 { 92 m_param_attrs.insert(m_param_attrs.end(), L"[out, retval]"); 93 m_param_types.insert(m_param_types.end(), m_typedesc + L"*"); 94 m_param_names.insert(m_param_names.end(), getNewIdentifier()); 95 m_typedesc = L"HRESULT"; 96 } 97 } 98 99 for (auto& bstr : bstrNames) 100 { 101 SysFreeString(bstr); 102 bstr = NULL; 103 } 104 105 ITypeInfo2 *pTypeInfo2 = NULL; 106 pTypeInfo->QueryInterface(IID_ITypeInfo2, (LPVOID *)&pTypeInfo2); 107 if (pTypeInfo2) 108 { 109 m_custom = getStringOfCustomData(NULL, pTypeInfo2, m_iFunc); 110 pTypeInfo2->Release(); 111 } 112 113 return S_OK; 114}
参考資料:
FUNCDESC structure (oaidl.h)
ITypeLib interface (oaidl.h)
ITypeLib2 interface (oaidl.h)
ITypeInfo interface (oaidl.h)
ITypeInfo2 interface (oaidl.h)
どうか、よろしくお願いします。