小弟改了一個進程內服務器的組件,主線程為MTA,但是DL 組件的
ThreadingModel="" 或 沒有 , 因此呼叫 CoGetClassObject/
CoCreateIntance[Ex]COM會自動建立Main STA(STA0),CoGetClassObject
調用得到的類場對象(proxy)沒問題,但是再調用類場的CreateIntance卻發生了 REGDB_E_IIDNOTREG 錯誤. 或是直接調用CoCreateIntance 是 E_NOINTERFACE 錯誤 , 不知是哪個環節出了錯誤 .http://support.microsoft.com/kb/150777/zh-tw 上面這個網只有指出套間與對象使用關係 , 而我上面的情況就是用戶端 伺服器  結果
------ ------  -----------------------------------------------------
MTA    無      proxy存取;伺服器載入到STA0;如果必要STA0由COM自動建立不知哪為大大能否說明上面這個模式的正確做法 , 或是我漏了哪個步驟~~代碼在此: http://myweb.fcu.edu.tw/~d9147897/InProc.rar主要是輸入2數到組件中再作相加並回傳到 client. 有問題步驟是卡在第2歨 ,  
若把主線程中的CoInitializeEx(NULL,COINIT_MULTITHREADED);改成
CoInitialize(NULL); 是沒問題的 , 因為所產生的組件沒有 PROXY可以直接調用.
0. 先編譯 AddObj 產生DLL 再編譯 VCClient 執行.
1. 顯示 MTA 和 STA 線程 ID , 表示確實有2個套間存在 , MTA是由COM所建立
2. CAddObj 的確有被創建 , 但是呼叫 pFactory->CreateInstance 或
   CoCreateInstance 所得到的 proxy 指針卻為 null , 問題就是在這.
3. 輸入 2數 並傳回結果在此感激不進!! 靠大家了~~

解决方案 »

  1.   

    可能需要向注册表中注册COM对象的PROXY/STUB, 不知是否注册了.如果用的是ATL实现的COM对象nmake -f XXXps.mak  // 生成PROXY/STUB相关DLLregsvr32 XXXps.dll  // 将PROXY/STUB注册到注册表
      

  2.   

    但是我的組件(dll)是進程內 , 應該不需要註冊 XXXps.dll ,
    這個步驟不是 dcom 的步驟嗎 ?還是進程內的組件也要一個 proxy/stub dll ?
      

  3.   

    不, 需要的, 这里我还坚持你上一回的帖子中的说法, 只要是跨Apartment, 就应该使用PROXY/STUB, 接口指针就应该被marshal/unmarshal, 虽然在同一进程内, 从内存访问的角度来说是可以直接访问的, 但从COM的threading model来说, 是违背的, 所以需要PROXY/STUB, 你提供的http://support.microsoft.com/kb/150777/zh-tw 好像也是这么说.你的这个问题我也遇到过, 同样是DLL In Proc Server, 注册PROXY/STUB后解决了.STA中的组件应该是线程亲和的.
      

  4.   

    朋友,能否說的更清楚一點,我上網查了一下資料
    proxy.dll 不就是在 InprocServer32 鍵裡 ,
    而我自己的AddObj.dll組件也在 InprocServer32 鍵裡.要如何加入 proxy.dll , 還是有你只的是要將 midl 所產生
    的 proxy/stub 代碼給加入 AddObj.dll ?問題白痴很不好意思^^
      

  5.   

    PROXY/STUB也是一个COM对象, 所以在注册表中也会有相应键值生成PROXY/STUB的具体做法可参见下面这个帖子:http://topic.csdn.net/t/20011106/17/357532.html如果使用ATL就更加简单, 只需在命令行CMD, 下面这样即可:
    nmake -f AddObjectps.mk  // 生成PROXY/STUB相关DLL
    regsvr32 AddObjectps.dll  // 将PROXY/STUB注册到注册表完成后, 你可以查看注册表, 在你定义的接口的IID下会有一个新定义的子键:ProxyStubClsid32, 通过这个子键, 就可以确定PROXY/STUB的位置, 即InprocServer32, 这样在MARSHAL接口的时候, 就不会出错了.可以将PROXY/STUB加入到AddObj.dll中, 但一般PROXY/STUB是一个独立的DLL
      

  6.   

    太感謝您了!!!!!!!!!!!!!!!!!!!!!!  成功了...但是我有很多疑問,你有MSN 嗎? 我想請教您..
    還有上面提到的 , 我想知道如何不產生 proxy.dll,
    而直接將 proxy/stub 代碼加入 AddObj.dll 裡.再次感謝您~~
      

  7.   

    可以結帖了~ 但是怎麼老是 "參數錯誤" ?我好像還看到有另一種方式: 使用類型庫 , 不過怎麼使用都不成功 Orz...