1. 程式人生 > >VB6.0中如何設定COM元件和ActiveX控制元件的CLSID值

VB6.0中如何設定COM元件和ActiveX控制元件的CLSID值

http://ajxfxb.blog.163.com/blog/static/56675086200911181118562/


VB中如何設定COM元件和ActiveX控制元件的CLSID值  

2009-12-18 11:01:08|  分類: VB6 |字號 訂閱

此問題以前一直沒有碰到過,因為VB建立的COM和ActiveX的工程,都是超級智慧,什麼都封裝好了,連元件註冊都幫你弄好了,而且VB沒有提供入口來修改這些屬性。
    以前用VB建立這類工程,不需要關心這些細節,也沒碰到過什麼問題,因為的確,CLSID都是自動生成,不需要人為干涉。直到今天去上海大平洋保險出差,遇到金蝶OA系統的一個問題:編設出來的元件CLSID和已經佈署的系統的CLSID不一樣!
    這下就出問題了,因為在完成測試新編譯出來的元件之前,我們不能把新改的元件佈署上去(反正原因很複雜……)。最後是沒辦法,只好研究一下VB中是如何設定元件的CLSID的。
    第一感覺就是VB建立工程的時候,用隨機演算法算出一組CLSID,然後存在某個地方,因為只有這樣,每次編譯時,才能保證同一組CLSID。但是把工程目錄搜尋了一遍,包括ASCII和二進位制搜尋,都搜不出來,挨個挨個檔案看也看不出。
    只好研究VB的工程相關設定,也沒發現,最後覺得有點令人懷疑的地方是所謂的Version Compatiblity(“版本相容”)。研究後終於搞清楚了其中來龍去脈。

    VB的相容卡中有三個設定:(工程屬性--部件--版本相容)
1、No Compatibility:不相容,此設定下,每次編譯出的CoClass和Interface的CLSID都會不一樣。
2、Project Compatibility:工程相容,此設定下,每次編譯出的CoClass的CLSID一樣,但Interface的CLSID不一樣。
3、Binary Compatibility:二進位制相容,此設定下,保證每次編譯出的CoClass和Interface的CLSID都一樣。

    當選擇2和3時,還要在下面的Edit輸入框中輸入欲與其相容的ocx檔案。也就是說,要保證2和3,工程移動時必須把dll/ocx都要一起拷過來。否則編譯出來的COM物件CLSID就不一樣了。
    如果丟失原來的ocx檔案,就會彈出“Unalbe to set the version compatible component:XXXX”錯誤資訊,你只能強制改為選項1不相容,但此時你編譯出來的元件CLSID會重新生成,也就是說和原來的就不一樣了。

    當然,因為型別庫本來就以資源形式掛在dll/ocx中,所以你也可以直接修改二進位制檔案。需要注意的是,資原始檔中是以二進位制來存的,不是以ASCII碼來存的。
   
    利用這些原理,也可以寫一個方便的外掛來實現在VB中對元件CLSID的設定,有空寫一個:)。

    另外,基於這種原因,如果使用VB編寫元件,使用方儘量使用ProgID,因為ProgID即VB中的子類名(.cls),也就是說,是可以很容易設定的。