在PB中使用OCX控件遇到的問題 |
gao在2009/8/12發表,被瀏覽4715次
|
最近在為高深商的JD-2000系列來電管理器編寫PB的使用實例,期間遇到了不少有關ActiveX控件在PB中的各種現象,先把我的經歷寫下來,希望對大家有所啟發。 關于OCX控件:這是一個專為高深商公司專為JD-2000系列來電管理器編寫的,用于電話的來電顯示、電話撥號、電話錄音、語音播放以及電話按鍵的檢測,是實現電腦與電話連接的重要中間控件。在它的內部已經處理了與硬件的連接,它可以自動查找連接到電腦的所有來電設備,并保存它們的設置;而不必關心它們連接在那一個端口、通訊的協議怎樣、有幾個設備等等。 要實現錄音功能只要將控件設為相應的錄音狀態,它會按你的要求自動生成錄音文件(wav),放到你指定的位置。生成的文件可以使用目前大多數的媒體播放器播放,當然包括Windows自帶的媒體播放器。需要播音時只要把錄音文件的文件名交給控件,它就會在你指定的線路上播出錄音文件。不管哪一條線路有來電進來,控件都會以事件發生的形式通知你。當然電話振鈴、摘機、掛機、按鍵等也會以事件發生的形式通知你。 本文的重點不在控件的功能,而是在它在PB中使用時的各種有趣的現象。我們知道,很早版本的powerbuilder 就開始支持ActiveX控件了通常的使用方法是 1、先注冊OCX控件,使用的辦法是在命令窗口 輸入 regsvr32.exe path\JDcomport.ocx 其中path是JDComport.ocx所在的路徑,在這個路徑下還應該包含一個控件要用到的動態鏈接庫 qtintf.dll 2、在你的窗體里加入JDComponent控件: 方法是:在系統菜單選擇Insert 選擇 Control子菜單 選擇 OLE... 進入 Insert Object 窗口 在Insert Object 窗口選擇 Insert Control頁 在Insert Control頁 找到 JDComponent Control 并把它放到窗體上即可。 在大多數情況下,你應該是很順利的,如果我也是這么順利的話,也就不會有本文了,很不幸的是我到不了這一步,就在第2步的時候PB就發生了災難性錯誤,整個退出了。具體的情況是當我在Insert Object 窗口選擇 Insert Control頁是 系統提示 Out of Memory 選擇 取消 系統退出。一開始我也懷疑是高深商的JD-2000系列來電管理器的OCX控件的問題,將這個問題反映給他們的工程師,他們的工程師也很快對他們的控件進行了檢測,也找不出什么問題來。這個控件在其它編程工具里用的很好,并沒有這種情況的發生。于是用google進行了搜索真還找到不少關于這個問題的文章和帖子。總結下來不外是: 1 這是PB的一個BUG 2 這是安裝了某些與pb不兼容的軟件 3 PB的兼容性不好 解決辦法: 1 用比較高版本的PB 或者使用補丁 2 卸載某些軟件 3 使用注冊表清理工具清理注冊表和實效軟件 4 重裝系統 以上辦法部分或全部多是行得通的。為了得到出現問題的真正原因,我進行了一次實驗,這個實驗室是這樣的: 1 安裝一個純的操作系統 這里用的是XP sp2,也就是出了操作系統和必要的驅動程序外什么也不安裝。 2 安裝pb6.5 3 注冊控件 4 使用控件 用之前介紹的方法添加JDComponent控件,不會再有系統崩潰的現象出現,之后反復用PB7 PB8 PB9 PB10進行一樣的測試,也不會出問題。由此可見,產生系統崩潰的原因是由于某些OCX控件引起的。在其后的實驗里進一步證明了這一點。在添加了控件的工程,回到有問題的操作系統時,正常使用這個控件是沒有任何問題的。我估計問題的產生是這樣的,添加一個OLE控件到窗體時要打開 Insert Object窗口上的 Insert Control頁,當這一頁被激活時,系統試圖去枚舉所有安裝到系統的ActiveX控件,結果在嘗試列出某個控件的某種屬性時除了問題,導致了系統的崩潰。因此只你的應用程序沒有用到有問題的控件就不會導致系統的崩潰,而且也僅僅是發生在控件列表之時。在PB9.0后的版本里 System Tree 窗口有了Components的一頁,我們通過這一頁的目錄樹仍然可以使用我們添加ActiveX控件到我們的程序里。 這個結果是否可以說PB就一點責任都沒有嗎?至少在我的電腦里PB10以上的版本就根本不會發生這樣的問題,也許這就是PB的一個改進吧。 最后給個BP安裝ActiveX控件的小結: 1、如果有得選擇,最好用PB10以上的版本,9.0版本的也勉強可用; 2、一定要用在9.0以下版本的,只好在一臺干凈的機器上添加上控件后再到你的機器里進編輯調試。
|
|
|
|