|開発環境|Microsoft Visual Studio Express 2013 for Windows Desktop| |実行環境|Microsoft Windows 8.1 (64bit)| |プロジェクトの種類|Visual C++/Win32 コンソール アプリケーション| |プロジェクト名|tlblist| |アプリケーションの種類|コンソール アプリケーション| |追加のオプション|空のプロジェクト, SDLチェック| 参考 -[[タイプライブラリ>http://eternalwindows.jp/com/auto/auto02.html]] tlblist.cpp #highlight(cpp){{ #include <stdio.h> #include <Windows.h> int main() { HRESULT hr; ULONG ul; hr = CoInitialize(NULL); // TCHAR szProgID[] = L"WScript.Shell"; TCHAR szProgID[] = L"SAPI.SpVoice"; wprintf_s(L"ProgID=[%s]\n", szProgID); // ProgID -> CLSID CLSID clsid; hr = CLSIDFromProgID(szProgID, &clsid); if (FAILED(hr)) { fwprintf_s(stderr, L"error: ProgID -> CLSID\n"); return 1; } // CLSID -> Dispatch IDispatch *pDisp; hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pDisp)); if (FAILED(hr)) { fwprintf_s(stderr, L"error: CLSID -> Dispatch\n"); return 1; } // Dispatch -> TypeLib ITypeLib *pTypeLib; UINT index; { ITypeInfo * pTypeInfo; hr = pDisp->GetTypeInfo(0, LOCALE_SYSTEM_DEFAULT, &pTypeInfo); hr = pTypeInfo->GetContainingTypeLib(&pTypeLib, &index); ul = pTypeInfo->Release(); } // TypeLib -> TypeInfo ITypeInfo *pTypeInfo; TYPEATTR *pTypeAttr; hr = pTypeLib->GetTypeInfo(index, &pTypeInfo); hr = pTypeInfo->GetTypeAttr(&pTypeAttr); if (pTypeAttr->typekind == TKIND_DISPATCH) { BSTR bstrName; hr = pTypeLib->GetDocumentation(index, &bstrName, NULL, NULL, NULL); wprintf_s(L"%u:[%s] F:%u V:%u\n", index, bstrName, pTypeAttr->cFuncs, pTypeAttr->cVars); SysFreeString(bstrName); for (UINT f = 0; f < pTypeAttr->cFuncs; f++) { FUNCDESC *pfd; UINT cNames; hr = pTypeInfo->GetFuncDesc(f, &pfd); hr = pTypeInfo->GetNames(pfd->memid, &bstrName, 1, &cNames); wprintf(L"%2u:%d %d %d:[%s]\n", f, pfd->invkind, pfd->cParams, pfd->cParamsOpt, bstrName); SysFreeString(bstrName); pTypeInfo->ReleaseFuncDesc(pfd); } } pTypeInfo->ReleaseTypeAttr(pTypeAttr); ul = pTypeInfo->Release(); ul = pTypeLib->Release(); ul = pDisp->Release(); CoUninitialize(); return 0; } }} レジストリからタイプライブラリをロード #region #highlight(cpp){{ #include <stdio.h> #include <Windows.h> int main() { HRESULT hr; ULONG ul; hr = CoInitialize(NULL); TCHAR szProgID[] = L"WScript.Shell"; wprintf_s(L"ProgID=[%s]\n", szProgID); // ProgID -> CLSID CLSID clsid; hr = CLSIDFromProgID(szProgID, &clsid); if (FAILED(hr)) { fwprintf_s(stderr, L"error: ProgID -> CLSID\n"); return 1; } // CLSID -> SubKey TCHAR szSubKey[256]; LPOLESTR lpsz; hr = StringFromCLSID(clsid, &lpsz); wprintf_s(L"CLSID=[%s]\n", lpsz); swprintf_s(szSubKey, L"CLSID\\%s\\TypeLib", lpsz); CoTaskMemFree(lpsz); // SubKey -> GUID TCHAR szData[256]; DWORD cbData = sizeof szData; LONG ret; ret = RegGetValue(HKEY_CLASSES_ROOT, szSubKey, NULL, RRF_RT_REG_SZ, NULL, szData, &cbData); if (ret != ERROR_SUCCESS) { fwprintf_s(stderr, L"error: SubKey -> GUID\n"); return 1; } wprintf_s(L"GUID=[%s]\n", szData); GUID guid; hr = IIDFromString(szData, &guid); // GUID -> TypeLib ITypeLib *pTypeLib; hr = LoadRegTypeLib(guid, 1, 0, 0, &pTypeLib); if (FAILED(hr)) { fwprintf_s(stderr, L"error: GUID -> TypeLib\n"); return 1; } // TypeLib -> TypeInfo UINT cTypeInfo = pTypeLib->GetTypeInfoCount(); for (UINT n = 0; n < cTypeInfo; n++) { ITypeInfo *pTypeInfo; TYPEATTR *pTypeAttr; hr = pTypeLib->GetTypeInfo(n, &pTypeInfo); hr = pTypeInfo->GetTypeAttr(&pTypeAttr); if (pTypeAttr->typekind == TKIND_DISPATCH) { BSTR bstrName; pTypeLib->GetDocumentation(n, &bstrName, NULL, NULL, NULL); wprintf_s(L"\n%u:[%s] F:%u V:%u\n", n, bstrName, pTypeAttr->cFuncs, pTypeAttr->cVars); SysFreeString(bstrName); for (UINT f = 0; f < pTypeAttr->cFuncs; f++) { FUNCDESC *pfd; UINT cNames; hr = pTypeInfo->GetFuncDesc(f, &pfd); hr = pTypeInfo->GetNames(pfd->memid, &bstrName, 1, &cNames); wprintf(L"%2u:%d %d %d:[%s]\n", f, pfd->invkind, pfd->cParams, pfd->cParamsOpt, bstrName); SysFreeString(bstrName); pTypeInfo->ReleaseFuncDesc(pfd); } } pTypeInfo->ReleaseTypeAttr(pTypeAttr); ul = pTypeInfo->Release(); } ul = pTypeLib->Release(); CoUninitialize(); return 0; } }} #endregion 出力 #highlight(text){{ ProgID=[SAPI.SpVoice] 21:[ISpeechVoice] F:39 V:0 0:1 2 0:[QueryInterface] 1:1 0 0:[AddRef] 2:1 0 0:[Release] 3:1 1 0:[GetTypeInfoCount] 4:1 3 0:[GetTypeInfo] 5:1 5 0:[GetIDsOfNames] 6:1 8 0:[Invoke] 7:2 0 0:[Status] 8:2 0 0:[Voice] 9:8 1 0:[Voice] 10:2 0 0:[AudioOutput] 11:8 1 0:[AudioOutput] 12:2 0 0:[AudioOutputStream] 13:8 1 0:[AudioOutputStream] 14:2 0 0:[Rate] 15:4 1 0:[Rate] 16:2 0 0:[Volume] 17:4 1 0:[Volume] 18:4 1 0:[AllowAudioOutputFormatChangesOnNextSet] 19:2 0 0:[AllowAudioOutputFormatChangesOnNextSet] 20:2 0 0:[EventInterests] 21:4 1 0:[EventInterests] 22:4 1 0:[Priority] 23:2 0 0:[Priority] 24:4 1 0:[AlertBoundary] 25:2 0 0:[AlertBoundary] 26:4 1 0:[SynchronousSpeakTimeout] 27:2 0 0:[SynchronousSpeakTimeout] 28:1 2 0:[Speak] 29:1 2 0:[SpeakStream] 30:1 0 0:[Pause] 31:1 0 0:[Resume] 32:1 2 0:[Skip] 33:1 2 0:[GetVoices] 34:1 2 0:[GetAudioOutputs] 35:1 1 0:[WaitUntilDone] 36:1 0 0:[SpeakCompleteEvent] 37:1 2 0:[IsUISupported] 38:1 4 0:[DisplayUI] }} spvoice.js #highlight(javascript){{ var sv = WScript.CreateObject("SAPI.SpVoice"); sv.Speak("hello, world"); }}