討論區快速選單
知識庫快速選單
傑米的攝影旅遊筆記 網路投保旅行平安險 政府補助!學嵌入式+物聯網
[ 回上頁 ] [ 討論區發言規則 ]
COM使用者觀點的請教.
更改我的閱讀文章字型大小
作者 : dlove1979(CofeKey)
[ 貼文 51 | 人氣 4376 | 評價 0 | 評價/貼文 0 | 送出評價 10 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2011/3/19 上午 10:33:56
各位先進好:有幾個比較觀念性的問題想要請教,就是必須要使用CoInitialize(NULL)來設計的軟體封裝成物件的觀念.諸如像DirectShow和WMEncoder以及DirectX的設計都是一開始用使用CoInitialize (NULL)以及UnCoIntialize () 來結束,在個人程式設計上是可以正確的執行的,但是有幾個觀念一直不是很清楚,使的所設計出來的軟體在執行一段時間後可能會有當機的狀況或者是無法預測的錯誤.問題如下:
不是非常確定為什麼要使用CoInitialize(NULL) .
若是一般的"程序"型的設計方法可以很簡單的寫完一個程序如下:
void DirectShow_T ()
{
HRESULT hr = 0 ;
IGraphBuilder* pgb = NULL ;
IMediaControl* Ctrl = NULL ;
hr = CoInitialize (NULL) ;
hr = CoCreateInstance (GUID , NULL , CLSCTX_INPROC_SERVICE, (void**)&pgb) ;
/*
一些建立Grapgbuilder的程序碼
*/
hr = pgb->QueryInterface (IID_IMediaControl , (void**)&Ctrl) ;
hr = Ctrl->Play() ;
Ctrl->Release () ;
pgb->Release () ;
CoUninitialize () ;
}
為了集中讓各位先進了解到想提出的問題,所以簡略掉程式部分的碼.以上的程式碼是可以執行的.可以播放出一個聲音檔.若是改成以下的程式碼,因為我的關於CoInitializeu以及所謂的COM或者是COM+的方面不是非常清楚,也就是這個程式寫作的觀念一直以來不甚清楚,故以上面這個基礎的例子加以延伸來此請教各位先進是否以"使用者"的觀點幫個人釐清有關於COM在使用上必須要注意的事項,避免程式在長時間的使用上造成記憶體遺漏而產生的當機或者是無法預測的一些錯誤.
void DirectShow_T2 ()
{
HRESULT hr = 0 ;
IGraphBuilder* pgb = NULL ;
IMediaControl* Ctrl = NULL ;
hr = CoInitialize (NULL) ;
hr = CoCreateInstance (GUID , NULL , CLSCTX_INPROC_SERVICE, (void**)&pgb) ;
/*
一些建立Grapgbuilder的程序碼
*/
hr2 = CoInitialize (NULL) ; //mark1
hr2 = pgb->QueryInterface (IID_IMediaControl , (void**)&Ctrl) ;//mark2
hr2 = Ctrl->Play() ; //mark3
CoUninialize() ; //mark4
Ctrl->Release () ; Ctrl = NULL ;
pgb->Release () ; pgb = NULL;
CoUninitialize () ;
}
標記mark1~4改變了一下,似乎也可以執行,但就是不知道設計出來的軟體穩不穩定了,也不知道它其中的差別在哪裡,請教第一和第二兩個程式碼有什麼不同嗎?
class Media1
{
public:
Media1()
{
HRESULT hr = 0 ;
hr = CoInitialize (NULL) ;
hr = CoCreateInstance (GUID , NULL , CLSCTX_INPROC_SERVER , (void**)&this->pgb);
/*
一些建立Grapgbuilder的程序碼
*/

}
HRESULT Play ()
{
hr = CoInitialize (NULL) ;
hr = pgb->QueryInterface (IID_IMediaControl , (void**)&Ctrl);
hr = Ctrl->Play () ;
Ctrl->Release () ;
CoUninitizlize () ;
}
~Media1()
{
pgb->Release();
CoUninitialize ();
}
protected:
IGrapyBuilder* pgb ;
IMediaControl* pCtrl;
};
作者 : dlove1979(CofeKey)
[ 貼文 51 | 人氣 4376 | 評價 0 | 評價/貼文 0 | 送出評價 10 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2011/3/19 上午 10:36:04
由於字數過多,在此延續問題.
===================
最後那個物件是我把之前的程序封裝成物件,功能都一樣.應也可以執行.在物件的建構式中有一個CoInitialize(NULL) , 但是沒有CoUninitialize(),在Play的成員函數中,有Cointialize(NULL)然後透過IGraphBuilder物件的QueryInterface取出函數指標之後,執行Play()播放出聲音檔,馬上在Release()接下來CoUninitialize(),以上描述的這一個部分是否可以不用在一次CoInitialize(NULL)和CoUninitialize()呢?似乎可以,只要在解構成員中一次Release掉IGraphBuilder並且CoUnititalize()就可以.
請教各位先進.

作者 : good(估得)
[ 貼文 146 | 人氣 225 | 評價 480 | 評價/貼文 3.29 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人dlove1979註記此篇回應為最佳解答 2011/4/15 下午 01:14:46
CoInitialize是用來初使化應用程式的Threading model用的,因為你使用CoInitialize,只能用來初使化STA,
而且一個應用程式只能被指定一個STA,所以,你只需要在main中呼叫一次CoInitialize就好了,你只能透過呼叫
過CoInitialize的那個Thread操作COM物件。
作者 : dlove1979(CofeKey)
[ 貼文 51 | 人氣 4376 | 評價 0 | 評價/貼文 0 | 送出評價 10 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2011/4/28 上午 10:16:26
謝謝!再請教一個問題,因為我一般來講都會將要的功能封裝為物件,如此的話,若在建構函數使用一個CoInitialize (NULL)然後在解構子使用CoUninitialize ()就應該不會有問題,可是因為一個應用程式可能使用到好幾十個或者是上百個我封裝的物件,這時候就會呼叫幾十個或者是上百個CoInitializ(NULL)了,這樣是否會對程式產生什麼穩定性上的問題?
我發現到微軟所釋出的例子中也有將需要使用到COM的程式設計技巧封裝成物件,所以我個人臆測是可以,可是就不知道這樣一個應用程式執行一段時間會不會當機?
作者 : good(估得)
[ 貼文 146 | 人氣 225 | 評價 480 | 評價/貼文 3.29 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2011/8/24 下午 08:55:19
不了解,有很多地方可以放,main或是dllmain,甚至複雜一點的singleton pattern都可以使用,為什麼要鍾情於constructor?
 板主 : 徵求中
 > COM/DCOM - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - COM/DCOM - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
COM/DCOM
1 估得 490 
2 nick 120 
3 PLAYER 110 
4 天雲 100 
5 Raynor 80 
6 青衫 60 
7 60 
8 Peter.huang 50 
9 酷小毅 50 
10 Giant 50 
COM/DCOM
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2017 程式設計俱樂部 http://www.programmer-club.com.tw/
0.03125