2012-03-07 83 views
2

我正在開發一個依賴於老化的OCX控件的.NET應用程序。該控制提供了允許用戶與航空公司預訂系統交互的終端界面。它已經在幾個VB6應用程序中'成功'使用,但是我們需要/希望在.NET應用程序中使用它。老化32位OCX控件無法在.NET中加載

因此,在使用.NET 4和Visual Studio 2010的Windows XP(x86)框中,我創建了使用已正確註冊的控件的Winforms和WPF應用程序。我已經實現了Reg Free COM,並且同時使用XCOPY和Click-Once,兩個項目都可以成功部署到Windows XP(x86)機器,並且都可以按預期方式工作,無需註冊控件。不幸的是,對於部署在Vista(x86)和Windows 7(x64)上的應用程序,在應用程序啓動但不提供控制的情況下無法實現。

爲了試圖理解問題,我嘗試在我的Windows 7(x64)開發環境中註冊控件。我試圖既:

  • 使用正常REGSVR32註冊控制(64註冊表)
  • 註冊放置在使用REGSVR32的Syswow64資料版本Syswow64資料目錄(86註冊表)

在控制這兩種情況下控件似乎已經成功註冊,並且在全新的Winforms項目中,我可以將控件添加到工具箱(圖標出現等)。然而,只要我把控件拖到窗體上,它就會在窗體的角落顯示爲一個小框(而不是像在XP上看到的終端窗口),即使Interop文件的生成方式與XP相同?

控制作爲選擇

Control in Windows 7

當XP

Control in XP

控制看作是在Windows 7中看到我已經花了年齡拖網網的任何一種解決方案或類似的問題無濟於事。歡迎任何建議!

更新1:

正如@DanielHilgarth的建議,我已經創建使用控制和Windows 7(64位)運行它,煩人它拿起註冊COM組件和工作在VB6一個基本的應用程序如預期的那樣,儘管.NET應用程序或項目可以一起運行,並且看不到控制權!

更新2

如果我使用的控制(但要求控制進行註冊,即不能無章)我的XP盒創建一個基本的Winforms應用程序。在Windows 7(x64)機器上運行此操作時,如果無法註冊控件,將無法啓動(如預期的那樣)。對於應用程序而言,該控件是否註冊在x86/x64註冊表中,似乎無關緊要,它將以何種方式啓動,但無法控制!

更新3

我注意到,如果我運行一個WinForms項目(在XP中創建和COM章免費)在我的Windows 7環境下,除非控制登記表單設計器會失敗(如預期)再次似乎不關心該組件註冊哪個註冊表。一旦註冊表單設計器將被視爲(無控制),當構建以下警告看出:

Windows 7 warnings

研究這個警告一直徒勞的,這似乎表明,Visual Studio是找錯了註冊表路徑,但我無法找到解決這個問題的方法?

+0

您可以在Win7機器上使用OCX控件成功使用VB6應用程序嗎? BTW:您可以將圖像上傳到ima​​geshack或類似的託管服務提供商,並將它們鏈接到您的問題中。 – 2012-03-07 12:11:34

+0

聽起來不像註冊問題,會產生異常。這聽起來像一個VB6控件,它不能在.NET窗體上託管。並不是每個場景都支持,它必須是一個相當行之有效的ActiveX控件。不能無窗,不能創建自己的頂層窗口等等。與該控件的所有者一起工作以繼續前進。 – 2012-03-07 12:53:37

+0

@DanielHilgarth,這是一個非常好的問題。之前我沒有走過這條路,因爲以前的開發者的VB6應用程序非常差,需要他'定製'安裝它們!但我會放棄它! – snipey 2012-03-07 13:03:25

回答

1

好吧,看起來好像問題是與DEP(數據執行保護)。我認爲OCX正在做的事情是不允許的!?

當運行各種測試Windows應用程序或任何註冊控件時,仍令人費解的是沒有任何異常。

爲了糾正這種情況,我按照這blog編輯了帖子構建。這意味着我可以調試並查看控件,並且在通過ClickOnce發佈控件時,現在可以在所有操作系統的XP/Vista/Windows 7上看到該控件。

不幸的是,控件在設計時仍然沒有看到,但我可以生活接着就,隨即!

1

我不認爲我能夠提供您的問題的答案,但也許我可以給你一些解決問題的想法。

我只是猜測,但您的問題的來源可能是64位Windows上的32位註冊問題,或許可問題,因爲您正在使用UAC運行。要排除最後一部分的故障,您可以關閉UAC並查看是否有幫助。

32在64位Windows

位COM I感測位混亂的約32和64位。 64位Windwos只有一個註冊表。但是,COM組件是32位或64位。這意味着在64位註冊表中需要有單獨的32位註冊區域,因此相同的註冊可以有兩種不同的實現(Wow6432Node)。

現在最重要的部分是,一個32位進程將看到註冊表的修改版本而不知道它。當COM組件註冊一個CLSID時,它使用路徑HKCR\CLSID不知道它被映射到HKCR\Wow6432Node\CLSID。另一方面,如果你想使用64位Regedit檢查32位註冊,你需要看看那裏。但是,使用位於%systemroot%\syswow64\regedit.exe的32位Regedit對64位上的32位註冊問題進行故障排除通常更容易,您可以在32位進程看到註冊表時看到註冊表。

要使用的控件是本機32位控件,不會加載或在64位過程中運行。你寫道你是「使用正常的regsvr32(x64註冊表)註冊控件」,但這是不可能的。您應該確保控件及其所有依賴項都從32位角度正確註冊。如果從64位的角度來看註冊,則需要充分了解Windows如何將註冊表重新映射爲32位(或者只需切換到32位註冊表編輯器)。

你顯然希望使用免註冊的COM,但在嘗試使用「舊學校」註冊之前,應該嘗試查看是否可以解決您的問題。

免註冊COM

我會推薦閱讀部分故障排除文章Registration-Free Activation of COM Components: A Walkthrough中:

當故障排除後免註冊COM問題,事件查看器[...]是你的朋友

+0

馬丁,感謝您花時間回覆!
以某種方式您對32/64位註冊表的混淆是正確的;主要源於試圖調查這個問題。在很多情況下,人們建議使用SysWow64目錄中的regsvr32.exe。我試圖在我的帖子中發現我已經使用了兩個版本的regsvr32.exe;在事件查看器中都看起來沒有問題,但仍然沒有任何效果!... – snipey 2012-03-12 09:55:27

+0

...您已經確認了我對Wow6432Node的理解,但是我仍然對Visual Studio中看到的警告有些困惑。我可以註冊組件;在'32bit'註冊表中查看'HKCR \ Wow6432Node \ CLSID'下的'x64'註冊表以及直接在'HKCR \ CLSID'下查找條目,但Visual Studio無法看到這個?... – snipey 2012-03-12 10:00:17

+0

。 ..我首先同意使用註冊方法,並且一直在測試各種事情。我注意到的一件奇怪事情是,我可以取消註冊該組件並確認沒有在註冊表中留下的類ID。然而,只要組件DLL位於Windows \ SysWow64目錄中,VB6測試應用程序(在已註冊組件的XP機器上創建)就可以工作? – snipey 2012-03-12 10:04:22

相關問題