使用跨套間的組件出現錯誤

ffaannccyy 2007-01-15 02:13:45
小弟改了一個進程內服務器的組件,主線程為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數 並傳回結果

在此感激不進!! 靠大家了~~
...全文
184 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
crumpy 2007-01-16
  • 打赏
  • 举报
回复
请查论坛短消息
ffaannccyy 2007-01-16
  • 打赏
  • 举报
回复
可以結帖了~ 但是怎麼老是 "參數錯誤" ?

我好像還看到有另一種方式: 使用類型庫 , 不過怎麼使用都不成功 Orz...
ffaannccyy 2007-01-15
  • 打赏
  • 举报
回复
但是我的組件(dll)是進程內 , 應該不需要註冊 XXXps.dll ,
這個步驟不是 dcom 的步驟嗎 ?

還是進程內的組件也要一個 proxy/stub dll ?
crumpy 2007-01-15
  • 打赏
  • 举报
回复
可能需要向注册表中注册COM对象的PROXY/STUB, 不知是否注册了.

如果用的是ATL实现的COM对象

nmake -f XXXps.mak // 生成PROXY/STUB相关DLL

regsvr32 XXXps.dll // 将PROXY/STUB注册到注册表
ffaannccyy 2007-01-15
  • 打赏
  • 举报
回复
太感謝您了!!!!!!!!!!!!!!!!!!!!!! 成功了...

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

再次感謝您~~
crumpy 2007-01-15
  • 打赏
  • 举报
回复
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
ffaannccyy 2007-01-15
  • 打赏
  • 举报
回复
朋友,能否說的更清楚一點,我上網查了一下資料
proxy.dll 不就是在 InprocServer32 鍵裡 ,
而我自己的AddObj.dll組件也在 InprocServer32 鍵裡.

要如何加入 proxy.dll , 還是有你只的是要將 midl 所產生
的 proxy/stub 代碼給加入 AddObj.dll ?

問題白痴很不好意思^^
crumpy 2007-01-15
  • 打赏
  • 举报
回复
不, 需要的, 这里我还坚持你上一回的帖子中的说法, 只要是跨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中的组件应该是线程亲和的.

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧