「C言語/C++/tlblist」の編集履歴(バックアップ)一覧はこちら
C言語/C++/tlblist - (2014/04/05 (土) 16:54:01) の1つ前との変更点
追加された行は緑色になります。
削除された行は赤色になります。
|開発環境|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";
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;
}
}}
#region
#highlight(cpp){{
#include <stdio.h>
#include <Windows.h>
int main()
{
HRESULT hr;
ULONG ul;
hr = CoInitialize(NULL);
TCHAR szProgID[] = L"WScript.Shell";
wprintf(L"ProgID=[%s]\n", szProgID);
// ProgID -> CLSID
CLSID clsid;
hr = CLSIDFromProgID(szProgID, &clsid);
if (FAILED(hr)) {
return 1;
}
// CLSID -> Dispatch
IDispatch *pDisp;
hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pDisp));
if (FAILED(hr)) {
return 1;
}
// Dispatch -> TypeInfoTmp
UINT ctinfo;
hr = pDisp->GetTypeInfoCount(&ctinfo);
if (ctinfo != 1) {
return 1;
}
ITypeInfo *pTInfoTmp;
hr = pDisp->GetTypeInfo(0, 0, &pTInfoTmp);
// TypeInfoTmp -> TypeLib
ITypeLib *pTLib;
UINT index;
hr = pTInfoTmp->GetContainingTypeLib(&pTLib, &index);
// TypeLib ->
UINT cti = pTLib->GetTypeInfoCount();
for (UINT n = 0; n < cti; n++) {
ITypeInfo *pTInfo;
hr = pTLib->GetTypeInfo(n, &pTInfo);
TYPEATTR *pTypeAttr;
hr = pTInfo->GetTypeAttr(&pTypeAttr);
if (pTypeAttr->typekind == TKIND_DISPATCH) {
BSTR bstrName;
pTLib->GetDocumentation(n, &bstrName, NULL, NULL, NULL);
wprintf(L"%u:[%s] F:%u V:%u\n", n, bstrName, pTypeAttr->cFuncs, pTypeAttr->cVars);
SysFreeString(bstrName);
for (UINT f = 0; f < pTypeAttr->cFuncs; f++) {
FUNCDESC *pFuncDesc;
hr = pTInfo->GetFuncDesc(f, &pFuncDesc);
UINT cNames;
hr = pTInfo->GetNames(pFuncDesc->memid, &bstrName, 1, &cNames);
wprintf(L"\t%u:[%s]\n", f, bstrName);
SysFreeString(bstrName);
pTInfo->ReleaseFuncDesc(pFuncDesc);
}
}
pTInfo->ReleaseTypeAttr(pTypeAttr);
ul = pTInfo->Release();
}
ul = pTInfoTmp->Release();
ul = pDisp->Release();
CoUninitialize();
return 0;
}
}}
#endregion
|開発環境|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");
}}