討論區快速選單
知識庫快速選單
軟體開發過程中有哪些資安漏洞? 網路投保旅行平安險 討論區最近新進100則主題
[ 回上頁 ] [ 討論區發言規則 ]
多個 CLSID
更改我的閱讀文章字型大小
作者 : fancy(8086) 人氣指數超過10000點
[ 貼文 95 | 人氣 19471 | 評價 0 | 評價/貼文 0 | 送出評價 8 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/12/3 上午 11:51:16
各位大大好 , 小弟有些觀念需要解惑一下 .

一般來說 , 一個 class factory 只會產生一種特定的 com 對象 , 但是書上有個範例 ,
在實作 DllGetClassObject 時 , 通常是產生 class factory 對象.

書上在實作 DllGetClassObject , 先以3個不同 class 來取代class factory , 此範例想要表明
如何在一個SERVER 中實現多個類 , 範例簡化如下:

STDAPI DllGetClassObject(REFCLSID rclsid,REFIID riid,void* ppv)
{
   static A AA;
   static B BB;
   static C CC;
  
   if(rclsid==CLSID_A)
   return AA.QueryInterface(riid,ppv);
   else if(rclsid==CLSID_B)
   return BB.QueryInterface(riid,ppv);
   else if(rclsid==CLSID_C)
   return CC.QueryInterface(riid,ppv);
   *ppv=0;
   return CLASS_E_CLASSNOTAVAILABLE;
}


若換成 class factory 來設計 :
STDAPI DllGetClassObject(REFCLSID rclsid,REFIID riid,void* ppv)
{
    
  
   if(rclsid==CLSID_A)
   {
     AFactory *pAFactory = new AFactory;
     return pAFactory ->QueryInterface(riid , ppv);
   }

   else if(rclsid==CLSID_B)
   {
     AFactory *pBFactory = new BFactory;
     return pBFactory ->QueryInterface(riid , ppv);
   }

   else if(rclsid==CLSID_C)
  {
     AFactory *pCFactory = new CFactory;
     return pCFactory ->QueryInterface(riid , ppv);
   }

   *ppv=0;
   return CLASS_E_CLASSNOTAVAILABLE;
}


現在的問題是 , 當我呼叫 CoGetClassObject 指定 CLSID 時來獲得
IClassFactory , 若想要依照不同的類型的 CLSID 來得到不同的
class factory 對象 , 是不是要在註冊表底下 , 註冊3個不同類型的
CLSID !?也就是說 , 每增加一個不同類型的類場 , 揪需要多註冊一個 CLSID.





作者 : fancy(8086) 人氣指數超過10000點
[ 貼文 95 | 人氣 19471 | 評價 0 | 評價/貼文 0 | 送出評價 8 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/12/4 下午 06:41:20
拜託各位大俠近來看看吧~~
小弟感激不盡@@

書上範例是大陸簡體的 <COM本質論> P.94 3.5 節的末段
台灣應該也是大概這個位置吧~~
作者 : good(估得)
[ 貼文 146 | 人氣 225 | 評價 480 | 評價/貼文 3.29 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/12/22 下午 06:28:19

不懂什麼是"類場"?

每一個class都會有一個自己的class id,com依照這個id來區別不同的class(原諒我的囉唆)。

假設你所謂的"類場"是class factory,那你的問題就很奇怪了。

第一,假設class數目大於factory的數目,可能代表你的factory可以產生一種一以上的class的實體,這樣的可能性很高,或是,你的factory的回應相同的實體給不同的class id,既然是相同的實體,為何又要大費周章的產生兩個不同的class?我覺得比較合理的解釋是為了向前相容。

第二,假設class的數目小於factory的數目,這也是很奇怪,從函數的結構看來,不太可能會有這種情況,因為決定要用哪一種factory是用CLSID來決定,所以,factory的數目不會大於class的數目。

ok,回到你的問題,"假設每增加一個class factory,就需要增加一個CLSID",問題本身就有問題,你好像搞錯因果關係,因為你不會先增加factory,然後,再增加CLSID,因為你的factory的數目不可能大於class數目。
 板主 : 徵求中
 > 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-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
1.464844E-02