由於是 com base 的程式, 所以專案若是 unicode 時, BSTR 是不需要轉換的, 否則需要利用 comdef.h 中的 _com_util::ConvertBSTRToString 來轉型為 char *
字串轉型文章可以參考: http://blog.csdn.net/axes/articles/344040.aspx
以下函數必須 include 三個 header file
#include "strmif.h"
#include "uuids.h"
#include "comdef.h"
link 也要加入 strmiids.lib 才能順利進行.
程式碼如下,
代碼: 選擇全部
/////////////////////////////////////////////////
// ds_enum cap name
void ds_enumcapname()
{
// com initialize
CoInitialize(NULL);
ICreateDevEnum *pCreateDevEnum;
long hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,
IID_ICreateDevEnum, (void**)&pCreateDevEnum);
if(hr != NOERROR) {
AfxMessageBox(TEXT("Error Creating Device Enumerator"));
return;
}
IEnumMoniker *pEm;
hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,
&pEm, 0);
if(hr != NOERROR) {
AfxMessageBox(TEXT("Sorry, you have no video capture hardware"));
return;
}
pEm->Reset();
ULONG cFetched;
IMoniker *pM;
int uIndex=0;
CString s;
while(hr = pEm->Next(1, &pM, &cFetched), hr==S_OK) {
IPropertyBag *pBag;
hr = pM->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pBag);
if(SUCCEEDED(hr)) {
VARIANT var;
var.vt = VT_BSTR;
hr = pBag->Read(L"FriendlyName", &var, NULL);
if(hr == NOERROR) {
s.format("%d. %s", uIndex, _com_util::ConvertBSTRToString(var.bstrVal));
AfxMessageBox(s);
SysFreeString(var.bstrVal);
pM->AddRef();
}
pBag->Release();
}
pM->Release();
uIndex++;
}
pEm->Release();
// com uninitialize
CoUninitialize();
}
/////////////////////////////////////////////////
//
void ds_enumaudioname()
{
// com initialize
CoInitialize(NULL);
ICreateDevEnum *pCreateDevEnum;
long hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,
IID_ICreateDevEnum, (void**)&pCreateDevEnum);
if(hr != NOERROR) {
AfxMessageBox(TEXT("Error Creating Device Enumerator"));
return;
}
IEnumMoniker *pEm;
hr = pCreateDevEnum->CreateClassEnumerator(CLSID_AudioInputDeviceCategory,
&pEm, 0);
pCreateDevEnum->Release();
if(hr != NOERROR)
return;
ULONG cFetched;
IMoniker *pM;
pEm->Reset();
int uIndex=0;
CString s;
while(hr = pEm->Next(1, &pM, &cFetched), hr==S_OK) {
IPropertyBag *pBag;
hr = pM->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pBag);
if(SUCCEEDED(hr)) {
VARIANT var;
var.vt = VT_BSTR;
hr = pBag->Read(L"FriendlyName", &var, NULL);
if(hr == NOERROR) {
s.format("%d. %s", uIndex, _com_util::ConvertBSTRToString(var.bstrVal));
AfxMessageBox(s);
SysFreeString(var.bstrVal);
pM->AddRef();
}
pBag->Release();
}
pM->Release();
uIndex++;
}
pEm->Release();
// com uninitialize
CoUninitialize();
}