開発環境 |
Microsoft Visual Studio Express 2013 for Windows Desktop |
実行環境 |
Microsoft Windows 8.1 (64bit) |
プロジェクトの種類 |
Visual C++/Win32 コンソール アプリケーション |
プロジェクト名 |
tlblist |
アプリケーションの種類 |
コンソール アプリケーション |
追加のオプション |
空のプロジェクト, SDLチェック |
参考
tlblist.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;
}
レジストリからタイプライブラリをロード
+
|
... |
#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;
}
|
出力
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
var sv = WScript.CreateObject("SAPI.SpVoice");
sv.Speak("hello, world");
最終更新:2014年04月05日 16:54