2012-07-04 126 views
0

我有一個VB6項目編譯爲VB6 exe。VB6/.NET窗體互操作

它有一個簡單的形式作爲其啓動對象。

它通過regasm'd .NET dll啓動一個.NET模式窗體,並將其傳遞給一個回調COM接口(IHandler)的實現。

.NET回調到VB6中的IHandler實現。

VB6嘗試使用vbModal顯示新窗體。由於仍然可見的模式.NET窗體阻止了VB6窗體之間的交互。

有沒有解決方法或建議的方法?我試圖調用VB6在一個新的(STA)(託管)線程,但是當它試圖做MyCallbackForm.Show vbModal時,我得到「無效的過程調用或參數。」...我認爲必須與事實,我打電話回來一個新的線程...

更新:我能夠成功地在新線程回調,並顯示我的VB6表單模態如果我設置我的VB6項目類型爲ActiveX exe ...但一旦我這樣做了,我似乎失去了回調線程 - 從VB6到.NET的後續調用導致了跨線程異常。我猜這與使用ActiveX exe時的線程模型有關......

回答

0

您可以在VB6應用程序中顯示.NET控件無模式的表單,但是您必須這樣做:

  • 創建一個.NET用戶控件,其中包含應該在表單上的所有內容。
  • 使用MS InteropToolkit輕鬆創建一個COM可見的用戶控件,並讓這種控制從用戶控件繼承(你也可以跳過第一步,使用戶控件直接COM可見)
  • 在VB6創建一個新形式項目,並將COMVisible .NET用戶控件添加到它。
+0

問題是沒有顯示.NET窗體,它是一旦我以模態顯示它,VB6回調無法捕獲用戶交互 – Jeff

0

您可以將您的VB6 EXE項目拆分爲兩個項目。
第一個項目是當前的VB6項目減去您希望能夠從.Net DLL顯示的子窗體。 項目二是一個VB6 ActiveX DLL項目,它應該包含您希望能夠從.net dll顯示的子窗體。

所以,與其這樣做的:1。 項目VB6.EXE調用NET的DLL傳遞IHandler 2. .NET項目中IHandler 3 IHandler(VB6實現)調用函數試圖展示一個窗體,沒有運氣。

你這樣做:1。 項目VB6.EXE調用NET的DLL傳遞的任何數據子窗體(S)從主體工程 2. .NET項目稱之爲「ShowYourSelf」功能中的ActiveX DLL包含子窗體(S需要)並傳遞任何需要的數據。

+0

有沒有辦法在沒有註冊ActiveX組件的情況下完成此操作? – Jeff

+0

有一種叫做免費的ActiveX,但我從來沒有用過它,所以我不能告訴你它是如何工作的 – GTG