開発環境 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