2009-07-21 65 views
3

我最近開發了一個用於VB6應用程序的.NET(Visual Studio 2008,面向.NET 2.0的項目)的互操作用戶控件。該程序集顯示1個控件,1個類,以及一些枚舉和結構。我使用Interop Forms Toolkit 2.0項目模板found here的C#翻譯開發了它。該組件具有很強的名稱和被安裝在GAC與regasm與下面的腳本註冊:編譯具有.NET interop的VB6應用程序,僅在我的機器上編譯時才運行

@"C:\gacutil.exe" /i "C:\Program Files\AppName\Control.dll" /f 
@"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\regasm.exe" "C:\Program Files\AppName\Control.dll" /tlb:"C:\Program Files\AppName\Control.tlb" 

問題:當我編譯我的機器上的VB6應用程序,它可以運行在任何就好了其他機器(當然是安裝了控制器)。但是,當應用程序在不同的機器上編譯時,它將在該機器上運行,但不在任何其他機器上運行。當我說它沒有運行時,我的意思是你試圖運行它,並且完全沒有任何反應。

我用OleView來檢查我的機器和其他機器上的控件,並且所有GUID在類型信息中都是相同的。唯一的區別是一行有importlib(「stdole2.tlb」),另一行有importlib(「STDOLE2.TLB」)。我的機器有:Visual Studio 6.0 sp6,VB6 interop用戶控件模板,Windows SDK 6.0和6.0A,Visual Studio 2008 sp1。這臺機器是可以工作的。

同事機:的Visual Studio 6.0 SP6,Visual Studio 2005中

另一臺機器:的Visual Studio 6.0 SP6時,Visual Studio 2008。2008年被安裝在這個早上,並沒有解決問題。

如何讓這些其他機器正確編譯VB6應用程序,以便它可以在編譯它的機器之外的機器上運行?

(PUT請求更多的信息,評論,我會編輯此提供答案。)

編輯:

有人建議對涉及註冊的控制權限作出。我想澄清一下,控制似乎運作良好。我用完全相同的方式在工作的機器上註冊它,而不用那些。當引用控件的VB6應用程序在我自己以外的機器上編譯時,問題就會顯現出來。

我還應該補充一點,我有一個小型的VB6主機應用程序,它有1個窗體,互操作控件和一對按鈕。這個不會出現與主VB6應用程序相同的問題。

可能是一個線索

如果有人是熟悉使用OLEView.exe這類,我想我可能已經發現了一個線索。當我查看類型庫列表時,有「OrderControl(Ver 0.1)」以及「OrderControlCtl(Ver 0.1)」。第一個使用爲程序集定義的GUID,路徑顯示使用RegAsm.exe生成的OrderControl.tlb。第二個在不同的機器上有不同的GUID,我的路徑是「C:\ Program Files \ Microsoft Visual Studio \ VB98 \ vbc00305.oca」,另一臺機器上的路徑是「C:\ Program Files \ Microsoft Visual Studio \ VB98 \ mscoree.oca「,並在同事的機器上是」C:\ windows \ system32 \ mscoree.oca「。這兩個mscoree.oca都是相同的大小,但我的機器上的vbc00305.oca小几KB。

我再次查看了VB6項目的參考資料。引用列出了OrderControl和OrderControlCtl,但僅檢查了OrderControlCtl。 OrderControl的位置是TLB文件,但OrderControlCtl的位置是每個站上不同的OCA文件。

的Dependency Walker

我跑型材在DW的版本,我的機器和一個我們的構建機器(不會對礦井運行)上編上編譯的EXE的。他們在以下兩行發散。兩人都在第一線,但在運行一個繼續與更多的呼叫/負載,而沒有立即運行的一個開始的第一行這裏經過分離:

GetProcAddress(0x7E720000 [SXS.DLL], "SxsOleAut32RedirectTypeLibrary") called from "OLEAUT32.DLL" at address 0x7712A637 and returned 0x7E746129. 
GetProcAddress(0x7E720000 [SXS.DLL], "SxsOleAut32MapConfiguredClsidToReferenceClsid") called from "OLEAUT32.DLL" at address 0x7712A637 and returned 0x7E745C0D. 
+0

有它得到了與權限呢?我的意思是 - 試着把控制放在一個目錄中,哪個用戶可以訪問,註冊它並看看是否有效。 – shahkalpesh 2009-07-21 16:56:01

+0

@shahkalpesh:我不確定我瞭解你的建議。但我確實知道所有內容都在Windows XP中,以管理員級別的用戶身份運行。 – 2009-07-21 17:06:36

回答

2

因爲我已經發現,它與我的控制3個特定的方法是被「回」(通過ref參數)結構做。我最終使用了一個涉及返回類而不是結構的解決方法。但我仍然好奇,所以我問了一個different question

0

嘗試從形式刪除用戶控制在你的主VB6應用程序中並重新添加它。

+0

這沒有奏效。 – 2009-07-22 15:18:46

0

不知道,但我也有這樣的問題。嘗試使用/ codebase使用regasm。

相關問題