線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1650
推到 Plurk!
推到 Facebook!

Import Type Library 匯入一個 COM

答題得分者是:RaynorPao
ray24
中階會員


發表:18
回覆:88
積分:56
註冊:2002-07-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-12-03 18:34:11 IP:210.68.xxx.xxx 未訂閱
使用 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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-12-04 00:48:25 IP:61.221.xxx.xxx 未訂閱
引言: 使用 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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-12-04 09:58:28 IP:210.68.xxx.xxx 未訂閱
RaynorPao 前輩小弟不才 看了您精闢解說後依然有兩個問題不解 1.CoInitialize與CoInitializeEx有何不同呢? 2.下面這段碼是把COM 其他的Interface加入嗎?那為何最後又把他 Release 掉   若要使用其他Interface的method該在哪一段中使用呢?    if(SUCCEEDED(hr)) {   pA->AMethod1(...);   ...................   pA->Release(); }    還請前輩指點... 台上一分鐘,台下十年功
------
台上一分鐘,台下十年功
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-12-04 10:45:48 IP:203.73.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-12-05 10:56:26 IP:210.68.xxx.xxx 未訂閱
感謝 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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2002-12-05 11:14:58 IP:203.73.xxx.xxx 未訂閱
引言: 我想轉成bcb 但FormatHResult 似乎沒有定義 還請前輩指點...
ray24 你好: #include "windows.h" 請用 FormatMessage (M$DN 中有 sample code) --
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
ray24
中階會員


發表:18
回覆:88
積分:56
註冊:2002-07-24

發送簡訊給我
#7 引用回覆 回覆 發表時間:2002-12-06 17:57:31 IP:210.68.xxx.xxx 未訂閱
真是非常感謝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()”。 台上一分鐘,台下十年功
------
台上一分鐘,台下十年功
系統時間:2024-04-20 14:21:49
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!