2012-08-22 43 views
0

呵呵我得到了一個小概率,實際上我希望能夠看到我插入設備的列表 我想在MessageBox() 的第一個地方看到它們,但是這種變體讓我感到厭煩^ _ ^),我試過很多方法,但無果而終顯示消息框中的變體類型值

IMoniker *tmpMonk=NULL; 
ULONG done; 
VARIANT varName; 
while(this->deviceClassEnum->Next(1,&tmpMonk,&done)==S_OK) 
{ 
    IPropertyBag *tmpBag=NULL; 
    tmpMonk->BindToStorage(0,0,IID_IPropertyBag,(void **)&tmpBag); 
    VariantInit(&varName); 
    checkIt(tmpBag->Read(L"FriendlyName",&varName,0)); 
      // this i wana see what is inside but huuuuuuuuuuuuuh 
    MessageBox(this->app,TEXT((LPCSTR)varName.bstrVal),"",NULL); 
    VariantClear(&varName); 
    tmpBag->Release(); 
} 

其次如何能夠從設備切換到另一個。從 無論菜單或列表

回答

3

您需要致電MessageBoxW而不是MessageBox。並刪除演員。所以它看起來像:

MessageBoxW(this->app, varName.bstrVal , L"", NULL); 

這是字符編碼的問題; COM中使用的字符串類型爲BSTR,可用於與PWSTR/PCWSTR類型相同。這與PCSTR不兼容。請記住,演員只是告訴編譯器「嘿,我知道我在做什麼,閉嘴」。除編譯器的消息實際上試圖幫助你,你告訴他們消失。下次聽他們講。

+0

thx tenfour它的工作原理我從來不知道MessageBoxW存在,我應該把這些名稱放在集合中以便能夠從設備切換到另一個? –

+0

每個/大多數(?)Windows-API函數存在兩種變體,* A和* W。根據您是否在項目設置中定義了UNICODE,Windows頭文件將「MessageBox」定義爲MessageBoxW或MessageBoxA。這是爲了您的方便,但您始終可以明確地調用適當的版本。 –