2015-10-28 24 views
2

我在C#中創建了一個COM Interop控件,用於我的PB應用程序。如果我添加一個ole控件到我的userobject並在畫家中選擇我的C#對象,那麼將創建一個olecustomcontrol,並且一切都按預期工作。但是,爲了在構建64位平臺的項目時使用64位版本的對象(在PB Classic 12.6中),我添加了一個ole控件,但在要求選擇一個對象時添加了一個取消對象,因此需要取消一個對象,所以我們需要一個olecontrol被創建,我可以使用InsertClass在運行時選擇我的對象。這對我有用,但我遇到了一個問題:當用戶點擊我的控件時,激活它,MDI窗口上的工具欄圖標消失。從我所做的研究中,聽起來像PB可能期望ole對象提供菜單和工具欄,但我的PB菜單項不受影響,它只是工具欄。我的控件包含一個工具欄(該控件是我創建的一個富文本編輯器,用於解決內置控件的一些缺點),但我也嘗試創建一個新的Interop控件,只有一個純文本框並獲得相同的結果。其實我也嘗試使用我的系統上安裝的Microsoft控件(Microsoft InkEdit Control)之一,並且再次獲得了相同的結果。在我的PowerBuilder應用程序中激活OLEControl時,工具欄項消失

有誰知道我該如何解決這個工具欄問題? (我很茫然,但我猜測可能是我需要以某種方式告訴PB忽略OLE工具欄和/或告訴我的C#對象不要公佈工具欄。)

回答

1

啊,那個遺留代碼我們必須支持幾十年...

以下將需要一些研究,可能不會最終解決問題,但我會試試看。我會實現一個「代理」COM對象,它將充當.NET OLE控件和它的OLE容器之間的額外層。這樣的對象將作爲OLE控件暴露給PB運行時,並作爲OLE容器暴露給.NET控件,並在這兩者之間轉發COM方法調用。用C++/ATL編寫這個圖層會容易得多,但它也應該可以用裸C#來實現。

然後,我會看到IOleInPlaceFrameIOleInPlaceUIWindow接口上的呼叫,並阻止導致不需要的工具欄行爲(如果有的話)的呼叫。我還會將暴露給PB運行時的一組OLE控制接口限制在最低限度。

AxHostControl類的實現細節可能在這裏有幫助,以及ATL庫源代碼。

+1

謝謝,這聽起來像這可能會讓我繼續下去。我本週正在忙於其他項目,但是當我有時間時會對此進行調查。 – Dan

+0

@丹,過去當我需要在傳統的Borland C++ Builder應用程序中託管.NET控件時,我已經取得了一些成功。然而,我正在處理一個不同的問題,涉及到keyboad和焦點行爲。 – Noseratio

+0

那麼我的下一個問題是VS不會讓我創建C++/ATL項目,它只是說不能創建項目。很顯然,其他人也遇到了類似的問題,他們無法創建C++項目,但沒有任何解決方案奏效。無論如何,我想弄清楚如何在C#(或其他語言)中做到這一點,但我很難找到一個地方開始。有什麼建議麼? – Dan

相關問題