麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > Delphi > 正文

Delphi使用VB編寫的ActiveX控件全攻略

2019-11-18 18:27:01
字體:
供稿:網(wǎng)友
前言
       在最近幾周的工作里,始終被一個頭疼的問題所困擾,那就是VB6編寫的ActiveX控件在Delphi環(huán)境下存在著諸多稀奇古怪的問題,幾經(jīng)周折,終于在搜索了幾乎全部的論壇、資料后,找到了針對不同Delphi版本發(fā)生的問題的解決辦法。

 

Delphi 5 莫名其妙的致命異常之一
       首先,我們來看看VB寫的ActiveX控件在Delphi 5下面的奇怪表現(xiàn)。

例如:我們用VB編寫了一個控件UserTest(為簡單起見,我們只導(dǎo)出一個類即用戶控件),一個屬性TestName,一個方法TestMethod。然后將其編譯成一個ActiveX控件,注冊并導(dǎo)入Delphi5的開發(fā)環(huán)境(以上步驟如有未清楚之處,請查閱各類參考資料,肯定有標準答案),到目前為止,看來一切正常。

然后,我們習(xí)慣的把控件拖放到窗體上,調(diào)整大小,在屬性窗口中為屬性賦值,或者在代碼中也是一樣,非常正常,好用的很。但是,下面問題來了,如果您興致勃勃的去調(diào)用了那個TestMethod,那么您將得到一個古怪的異常 “Ole Error 800a01a9”,然后程序退出,而且非常不幸的是,您將無法跟蹤到這個異常,在Delphi中或是VB中都是,當(dāng)然如果您對匯編很在行的話,您可以跟著Delphi的調(diào)試窗口一步一步往下……

當(dāng)我第一次碰到這個問題的時候,我?guī)缀跏菓嵟模驗闊o論是MicroSoft或是Borland,對該錯誤都沒有任何解釋,也沒有任何可以查找的資料。我只好跑到常去的幾個論壇,當(dāng)然最主要的還是CSDN,在VB版和Delphi版中四處搜索類似的問題,然后非常遺憾的是,只有類似的問題,而沒有答案,一個大客戶就用的這個開發(fā)工具,我在測試了幾乎所有Windows上的開發(fā)工具和開發(fā)環(huán)境(包括桌面和WEB)后,惟獨將Delphi忘記了。

剩下的兩天里,我?guī)缀跏菨M世界亂跑,給所有的朋友打電話,詢問Delphi方面的高手是否知道這個情況,最后,我從Google上搜到了一個鏈接,可惜的是現(xiàn)在我忘記了那個鏈接的具體位置,但是我得到了一個近乎Magic的方法(發(fā)現(xiàn)者是這么稱呼它的):

 

一個手工修改Delphi導(dǎo)入VB ActiveX控件后產(chǎn)生的代理類型庫XXX_TLB.PAS(這里XXX指的是控件的類名)文件的方法可以解決這一問題。舉例說明:

       

       有一個VB 寫的控件 UserControl1 ,在Delphi中導(dǎo)入后產(chǎn)生兩個文件,其中一個UserControl1_TLB.PAS 就是我們所要修改的文件。

       在文件中查找 類似

       

FintF: _UserControl1;

Function GetControlInterface:_UserControl1;

 



 

PRoperty ControlInterface: _UserControl1 read GetControlInterface;

 

GetControlInterface;

 

以及

 

procedure TUserControl1.CreateControl;

       procedure              DoCreate;

       begin

              Finf:=IUnknown(OleObject) as _UserControl1;

       End;

Begin

       If Finf=nil then DoCreate;

End;

 

Function TUserControl1.GetControl1Interface: _UserControl1;

 

Begin

       CreateControl;

       Result:=Finfl;

End;

 

請注意:這里紅色標出的 _UserControl1 要 全部換成 _ UserControl1Disp,如果編譯不成功的話,請將編譯警告中報出的_UserControl1 全部換成 _UserControl1Disp,編譯即可,這樣在調(diào)用控件的方法時便不會出現(xiàn)上述的致命錯誤。

 

感謝這個偉大的發(fā)現(xiàn),我只能這么形容它,否則可能到現(xiàn)在我還要在這個圈子里套不出來,或者就是使用另外的工具重新開發(fā)這個控件(我難以想象這個工作量會有多大,又或者它可能還會存在其他的兼容性問題)。

 

 

Delphi 5 莫名其妙的致命異常之二
但是,Delphi并沒有在我繞開這個限制之后而放過我,很快,客戶那邊發(fā)現(xiàn)另一個麻煩的問題,在開發(fā)環(huán)境下,每次運行時關(guān)閉載有控件的窗體都會跳出一個異常錯誤,但是在編譯后的應(yīng)用程序中則不會,雖然不會影響最終用戶的使用,但是這對開發(fā)人員來說是個不小的困擾,然后我用了上述例子去試,發(fā)現(xiàn)并不會發(fā)生這個問題。(我當(dāng)時就瘋了,這很可能是代碼中一些不兼容的用法所致,在一天時間里查找上萬行代碼是不是很正規(guī)是件極其恐怖的事情)我一氣之下,屏蔽了我的控件中所有的代碼,只留下用戶界面本身,然后奇怪的事情發(fā)生了,我什么代碼都沒寫,但是加載我的控件還是會發(fā)生這個錯誤,這使我又喜又驚,喜的是這個問題和我的代碼無關(guān),這樣查找起來會方便的多;驚的是只是拖放幾個VB中的標準控件居然也會造成這種恐怖的錯誤,Delphi5和VB6之間的矛盾還真不是一般的深。接下來的2個小時里,我不斷地刪除界面上的控件來測試到底是誰造成了這個致命的異常。

 

2個小時后,我舒了一口氣,問題找到了, 其根本問題是:

 

如果你在VB的用戶控件中使用類似Frame和PictureBox這樣的容器控件(其內(nèi)部可以包含其他控件)時,那么您將不可以在這些控件中添加Label、Line、Image這樣的windowLess控件(也就是無窗口控件,它們在運行時是VB實時畫出來的),否則您就會得到上面這樣的錯誤報告。

 

 

Delphi 6、7 隱蔽的ActiveX控件
       正是因為有了Delphi5下面的恐怖經(jīng)歷,我發(fā)現(xiàn)還是很有必要在Delphi6和7下面測試是不是也存在同樣的問題(之前的版本因為用戶極少已無必要,Delphi8還沒正式出,也暫不在考慮之列)。結(jié)果是:……無論我加載多少次,我在ActiveX欄上始終沒有發(fā)現(xiàn)那個期待已久的小圖標。這樣的結(jié)果當(dāng)然很滑稽,我連加載都做不到,更不要談什么測試正常不正常了。

       同樣的,我搜索各類論壇和網(wǎng)站,CSDN里我也發(fā)現(xiàn)了更多的類似問題的提出者,但答案還是零,無奈之下,我只好對每個Delphi6、7中的選項進行調(diào)整……

       歷時3小時15分54秒后,我找到了這個該死的問題(請原諒我這么稱呼它,我實在是忍無可忍)的原因,或者說是解決辦法,說起來其實很簡單。

現(xiàn)在請跟著我做:點擊Tools菜單->Environment Options->Type Library頁,我們應(yīng)該發(fā)現(xiàn)一項:Ignore special CoClass Flags When Importing,選中它,然后再選中Can Create那一項,那么現(xiàn)在,我們再嘗試去導(dǎo)入那個可憐的ActiveX控件吧(這里要注意,如果你已經(jīng)導(dǎo)入過一次,那么請把產(chǎn)生的那兩個文件 .dcr 和 .pas文件刪除,否則將不會刷新)。這次如果還是不能在ActiveX欄中發(fā)現(xiàn)那個控件的話,那么只有致電Microsoft或是Borland,問問看什么時候它們能結(jié)成親家,呵呵!

 

(另,在Delphi6和7中倒是沒有發(fā)現(xiàn)Delphi5中出現(xiàn)的上述錯誤)

 

我的測試環(huán)境是:

Win2K

Delphi 5 Update1

Delphi 6 Update2

Delphi 7

上一篇:在DELPHI中如何調(diào)用系統(tǒng)對話框

下一篇:用Delphi制作中國式報表

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
學(xué)習(xí)交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網(wǎng)友關(guān)注

主站蜘蛛池模板: 欧洲精品视频在线观看 | h色视频在线观看 | 成年性羞羞视频免费观看 | 色交视频 | 91福利免费观看 | 久久精品国产99国产精品澳门 | 欧美亚洲国产一区二区三区 | 黄网站进入 | 国产精品免费大片 | 久久国产精品区 | av影院在线播放 | 久久久久久久久久综合 | hd性videos意大利复古 | 精品国产一区在线观看 | 国产一级桃视频播放 | 在线观看一二三 | 一本色道久久综合狠狠躁篇适合什么人看 | 暴力肉体进入hdxxxx0 | 亚洲欧美日韩一区二区三区在线观看 | 亚洲国产成人一区 | 看免费一级毛片 | 91九色视频在线观看 | 国产成视频在线观看 | 国产精品久久久久久久久久久久久久久久 | 成人黄色小视频在线观看 | 国产精品久久久久久久久久三级 | 高清国产福利 | 国产精品久久久久久久久久尿 | 激情在线视频 | 国产一区在线免费 | 小情侣嗯啊哦视频www | 亚洲精品午夜电影 | 精国产品一区二区三区 | 国产精品视频免费网站 | 久久中文字幕在线观看 | 成人免费观看av | 美女被免费网站在线软件 | 最近国产中文字幕 | 青青草国产在线视频 | 久久久久久久高清 | 黄色大片大毛片 |