現象
我的這台機器上調用微軟的CDO或者CDOEX訪問Exchange郵箱發生了異常!而且ADSI也工作不正常。從外表上看,沒有任何錯誤的跡象。
重現步驟如下:
VB中創建一個應用程序;
引用CDOEX.DLL;
代碼寫入:
Set oMsg = CreateObject("CDO.Message")
oMsg.DataSource.Open(“http://BackEndServer/public”)
則在第二行得到這樣的錯誤:
Run-time error ‘-2147221164(80040154)’:
無法向注冊表寫入項
FrontEndServer 配置:
Windows Advanced Server 2000 內部版本號 2195:Service Pack 2
IE 版本:5.00.3315.1000 更新版本:SP2
CDOEX.DLL的版本號:6.0.4417.0
它所處的位置:C:\Program Files\Common Files\Microsoft
原因
首先在FrontEndServer 安裝了SQL Server 2000之前,我們可以使用CDOEX的IDataSource.Open打開用戶郵箱的:
_ConnectionPtr pCon = NULL;
CComPtr <CDO::IFolder>pFldr;
CComPtr <CDO::IDataSource>pSource;
hr=pFldr.CoCreateInstance(L"CDO.Folder");
pFldr->get_DataSource(&pSource);
hr=pSource->Open(bstrURLInbox,
(IDispatch*)pCon,
adModeRead,
adFailIfNotExists,
adOpenSource,
bstrUserDomainAccount,
bstrUserPwd);
但是安裝了SQL Server之後,MDAC就被更新到了version 2.6!!
由於Microsoft的過錯,早期的一些MDAC組件被MDAC 2.6刪除或者被覆蓋掉了!!
而運行IDataSource.Open,是需要引用MDAC 2.5的這些被刪除了的組件的,所以就會報出“Class Not Registered”的錯誤。
此時,如果運行下面的代碼:
Set con = CreateObject("ADODB.Connection")
con.Provider = "ADsDSOObject"
con.Open "ADs Provider"
最後一行會失敗並報錯:
run-tim error 429 ''''ActiveX component
can''''t create object''''
這種情況被新聞組的人們稱之為:
“ADSI toasting ADO”!!
這就是一個非常嚴重的問題了。你的要使用到以前的ADO的接口的程序可能都不行了!
所以,安裝了SQL Server 2000之後,請一定要下載最新的MDAC安裝包或者補丁。
解決這個CDOEX的問題,就是下載並安裝MDAC 2.6 SP1 (2.61.7326.6).exe。
小結
在任何機器上安裝SQL Server 2000時,都請注意這個問題!
一旦發現原來可以運行的程序現在爆出一些莫名其妙的錯誤,請先更新這台機器上的MDAC或者打SQL Server 2000 SP1。