Import Type Library 匯入一個 COM |
答題得分者是:RaynorPao
|
ray24
中階會員 發表:18 回覆:88 積分:56 註冊:2002-07-24 發送簡訊給我 |
使用 Type Library Import 匯入一個 COM 元件
再選擇 Install 成一個元件於元件盤上
此COM 有4個 Interface 分別如下 IOutA
IOutB
IOutC
IOutD 但使用元件時只能使用 IOutA 的Interface
該如何使用其他的 Interface 呢?
還是有別種方法來使用別人所提供的 COM 呢? 程式實作如下
HRESULT hr; IOutA *pA;
IOutB *pB;
IOutC *pC;
IOutD *pD hr=::CoInitializeEx(NULL,COINIT_MULTITHREADED);
::CoCreateInstance(CLSID_TMyCOM,0,CLSCTX_INPROC_SERVER,IID_IOutA,(LPVOID*)&pA); pA->QueryInterface(IID_IOutB,(LPVOID*)&pB);
pA->QueryInterface(IID_IOutC,(LPVOID*)&pC);
pA->QueryInterface(IID_IOutD,(LPVOID*)&pD); 實際執行到 CoInitializeEx 那一行就掛點了
return value 就是錯誤的
不知後輩哪寫錯了...請前輩們指點!! 台上一分鐘,台下十年功
------
台上一分鐘,台下十年功 |
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: 使用 Type Library Import 匯入一個 COM 元件 再選擇 Install 成一個元件於元件盤上 此COM 有4個 Interface 分別如下 IOutA IOutB IOutC IOutD 但使用元件時只能使用 IOutA 的Interface 該如何使用其他的 Interface 呢? 還是有別種方法來使用別人所提供的 COM 呢? 程式實作如下 HRESULT hr; IOutA *pA; IOutB *pB; IOutC *pC; IOutD *pD hr=::CoInitializeEx(NULL,COINIT_MULTITHREADED); ::CoCreateInstance(CLSID_TMyCOM,0,CLSCTX_INPROC_SERVER,IID_IOutA,(LPVOID*)&pA); pA->QueryInterface(IID_IOutB,(LPVOID*)&pB); pA->QueryInterface(IID_IOutC,(LPVOID*)&pC); pA->QueryInterface(IID_IOutD,(LPVOID*)&pD); 實際執行到 CoInitializeEx 那一行就掛點了 return value 就是錯誤的 不知後輩哪寫錯了...請前輩們指點!! 台上一分鐘,台下十年功ray24 你好: 以下是我個人習慣的用法~~參考看看吧 < class="code"> HRESULT hr=S_FALSE; IOutA *pA; //-------------------------------------------------------------------------- // Initialize COM hr=CoInitialize(0); if(SUCCEEDED(hr)) { //----------------------------------------------------------------------- // Create COM instance hr=CoCreateInstance(CLSID_TMyCOM, NULL, CLSCTX_SERVER, IID_IOutA, (void **)&pA); if(SUCCEEDED(hr)) { pA->AMethod1(...); ................... pA->Release(); } else { ................... } // End of create COM instance } else { ................... } // End of initialize COM //-------------------------------------------------------------------------- // Uninitialize COM CoUninitialize(); -- Enjoy Researching & Developing --
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
ray24
中階會員 發表:18 回覆:88 積分:56 註冊:2002-07-24 發送簡訊給我 |
RaynorPao 前輩小弟不才
看了您精闢解說後依然有兩個問題不解
1.CoInitialize與CoInitializeEx有何不同呢?
2.下面這段碼是把COM 其他的Interface加入嗎?那為何最後又把他 Release 掉
若要使用其他Interface的method該在哪一段中使用呢? if(SUCCEEDED(hr))
{
pA->AMethod1(...);
...................
pA->Release();
} 還請前輩指點... 台上一分鐘,台下十年功
------
台上一分鐘,台下十年功 |
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: 1.CoInitialize與CoInitializeEx有何不同呢? 2.下面這段碼是把COM 其他的Interface加入嗎?那為何最後又把他 Release 掉 若要使用其他Interface的method該在哪一段中使用呢? if(SUCCEEDED(hr)) { pA->AMethod1(...); ................... pA->Release(); }ray24 你好: 以下是我的說明 < class="code"> (1)CoInitialize, CoInitializeEx有什麼不同?? 請直接查詢 M$DN or Platform SDK(裡面有詳細的說明) http://msdn.microsoft.com/library/default.asp (2)為什麼最後要 release?? 有看到 CoCreateInstance 嗎?? 如果 Create COM Instance 成功了~~用完以後當然要 release 啦 就像 > (>>>>> --
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
ray24
中階會員 發表:18 回覆:88 積分:56 註冊:2002-07-24 發送簡訊給我 |
感謝 RaynorPao 兄的指導
昨天試了一天..終於可以動了 要如何知道 HRESULT 的錯誤訊息呢?
查了一下MSDN的說明..在VC中使用如下 CString strResult;
::FormatHResult(hr, strResult);
CString str;
str.Format(_T("CoInitializeEx Failed\n%s"), strResult);
AfxMessageBox(str, MB_OK | MB_ICONEXCLAMATION); 我想轉成bcb
但FormatHResult 似乎沒有定義
還請前輩指點... 台上一分鐘,台下十年功
------
台上一分鐘,台下十年功 |
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
|
ray24
中階會員 發表:18 回覆:88 積分:56 註冊:2002-07-24 發送簡訊給我 |
真是非常感謝RaynorPao兄的指導..我的問題已經獲得解決了..謝謝你
另外取得錯誤訊息內容的方式是使用 FormatMessage 的方式取得
下面是使用 FormatMessage 的範例..到網路上找的 下面的文章摘自“北京理工大學BBS”:
發信人: ZhiShao (De macau), 信區: C
標 題: 錯誤處理
發信站: 京工飛鴻 (Tue Nov 14 13:39:07 2000), 轉信 在VC中編寫應用程序時,經常需要涉及到錯誤處理問題。許多函數調用只用TRUE和FALSE來表明函數的運行結果。一旦出現錯誤,MSDN中往往會指出請用GetLastError()函數來獲得錯誤原因。
可問題是,GetLastError()返回的只是一個雙字節數值(DWORD)。OH,MY GOD!目前Win32的出錯編號已經從0排到11031,而這還不是錯誤編碼的全部。因為錯誤代碼還在不斷增加。
我想沒有人願意自己去查出錯編碼所對應的錯誤信息。好在Windows(Windows95以上, Window NT 3.1以上)已經提供了現成的錯誤信息處理函數:FormatMessage()。 以下是用FormatMessage()得到由GetLastError()返回的出錯編碼所對應錯誤信息的示例:
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
); // Process any inserts in lpMsgBuf.
// ... // Display the string.
MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION ); // Free the buffer.
LocalFree( lpMsgBuf );
不過有一點比較可笑,“該函數調用如果出錯,將返回0值,需要獲取錯誤信息,請調用GetLastError()”。 台上一分鐘,台下十年功
------
台上一分鐘,台下十年功 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |