2008-12-29 51 views
4

我需要在這裏讀一些思想,因爲我正在嘗試做我不完全理解的內容。在Vista 64位上使用來自C#或VBS的32位COM對象並獲取錯誤80004005

有一個32位應用程序(稱爲CQG的電子交易應用程序),它提供了一個用於外部訪問的COM API。我有從Excel,.NET(C++,VB和C#)和shell VBScript訪問此API的示例程序和腳本。我有這些.NET應用程序作爲源代碼和編譯的可執行文件(32位,在Windows XP上編譯)。

現在我有Windows Vista Home 64位,這讓我的腦子旋轉。 Excel示例工作得很好(在Excel 2003中)。編譯的.NET示例可執行文件也可以工作。

但是當我試圖運行.NET C#示例轉換爲Visual Studio C#Expression並編譯時,或者運行VBScript腳本時,嘗試創建對象時出現錯誤80004005。最初.NET應用程序也給了我80040154,但後來我想如何使它產生32位代碼而不是64位,所以現在C#和VBScript應用程序中的錯誤是相同的。這就是我現在所取得的所有進展。

是的,我嘗試從我的VBS上的SysWOW64文件夾運行32位版本的cscript.exe/WScript,但結果仍然是相同的(80004005)。

如何解決這個問題?我幾乎準備好相信這實際上是不可能的,但事實上,Excel VBA的工作原理和在Windows XP上編譯的.NET可執行文件運行得很好,這隻會讓我生氣。應該有辦法打敗這個東西(可能只有Windows Vista開發人員都知道的一些祕密)!我會感謝任何幫助!

PS:我相信代碼樣本沒有多大意義在這裏,但這個是VBScript中的線,失敗:

Set CEL = WScript.CreateObject("CQG.CQGCEL.4.0", "CEL_") 

這是C#:

CQGCEL CEL = new CQGCEL(); 

更新:忘了當然,說UAC已關閉。我正在從管理員權限開始工作。

我也試着看使用Process Monitor讀取哪些註冊表鍵,但對於這個對象的GUID,一切看起來都不錯。我無法識別其他一些GUID,所以我不確定他們是否批評。

這個COM對象有沒有可能使用Internet Explorer並得到錯誤的(如Internet Explorer 7而不是Internet Explorer 6引擎或其他東西)?

+0

你有沒有想過這個? – 2009-03-26 16:43:20

回答

3

有一些事情你必須記住一個64位機器。這些都是過去讓我感動的事情。

  1. 建築用於.NET任何CPU意味着 它將運行64位64位 機器上。
  2. 很多COM組件 似乎只有32位(我知道這個 是泛化,但通常是 的情況)。爲了使用它們,您需要將您的應用程序構建爲位(x86)32 位(x86)。
  3. 64位Windows具有 不同32和64位的註冊表 節點。例如,如果您運行註冊表編輯器 64位,你會看到 HKLM \ SOFTWARE \ Wow6432Node和 HKCU \ SOFTWARE \ Wow6432Node。該 包含32位應用程序的所有信息。

我的建議是建立一個32位的應用程序,看看會發生什麼。

0

一對夫婦有用的東西,你可以嘗試:

  1. 運行process monitor與過濾,以失敗進程中的輸出。看看是否有任何奇怪的錯誤報告。

  2. 同樣,嘗試在非託管調試器下運行並查看是否有任何其他第一次機會異常被拋出。這也可以讓你確認是否正在將進程COM進程加載到進程中。

  3. 嘗試關閉UAC並查看會發生什麼。

+0

已更新關於UAC和Process Monitor。 – alexandroid 2008-12-29 02:41:41

+0

我不知道我明白什麼非託管調試器或VS Express有它。 = \ – alexandroid 2008-12-29 02:44:19

1

問題可能是DEP。

我和你有完全相同的問題,並從CQG的技術支持獲得了一些幫助。數據執行保護默認情況下由Windows Vista &打開。您可以在命令提示符下使用

bcdedit.exe /set {current} nx AlwaysOff 

管理員權限之後將其關閉,如果你需要,你可以用

bcdedit.exe /set {current} nx AlwaysOn 

重啓重新開啓不提示,但是是必要的。您可以檢查使用

wmic OS Get DataExecutionPrevention_SupportPolicy 

您的DEP策略,其中0Always off1Always On2Opt in(和默認值),3Opt Out

將我的地雷改爲Always Off並重新啓動後,我能夠編譯而不會丟失80004005錯誤。