描述:
小弟改了一個進程內服務器的組件,主線程為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相关DLL
regsvr32 XXXps.dll // 将PROXY/STUB注册到注册表