簡體   English   中英

簡單的C ++ .Net控制台應用程序在64位Win7中崩潰

[英]Simple C++ .Net console app crashing in 64 bit Win7

我公司使用第3方DLL來連接某些硬件(在這里我將其重命名為hwLib )。 我想這是很久以前用VB6編寫的。 DLL帶有安裝程序以進行自身注冊,等等。

我們有一個使用它的C#應用​​,它可以在XP和Win7(32或64位)上正常運行。 但是我寫了一個簡單的C ++控制台應用程序,它可以在XP / 32位上正常運行,但在Win7 / 64位上崩潰。

#include "stdafx.h"
using namespace System;

int main(array<System::String ^> ^args)
{
    using namespace hwLib;
    ChwLib^ myLib = gcnew ChwLib();
    String^ str = myLib->GetDllVersion();
    Console::WriteLine(L"Hello hwLib");
    Console::WriteLine(str);
    Console::ReadLine();  //to keep window open til you hit the "any" key
    return 0;
}

未處理的異常:System.InvalidCastException:無法將類型為“ hwLib.ChwLibClass”的COM對象強制轉換為接口“ hwLib._ChwLib”。

該操作失敗是因為對IID為“ {E0560D1E-9A54-4EBF-83E8-D7BD2C936512}”的接口的COM組件上的QueryInterface調用由於以下錯誤而失敗:

不支持這樣的接口(HRE SULT的異常:0x80004002(E_NOINTERFACE))。 在System.StubHelpers.StubHelpers.GetCOMIPFromRCW(Object objSrc,IntPtr pCPCMD,Boolean&pfNeedsRelease)在hwLib.ChwLibClass.GetDllVersion()在main(String [] args)在mainCRTStartupStrArray(String []參數)

C#程序是一個更大,更復雜的程序,否則我會在這里發布它,它在同一系統上運行沒有問題。

COM早於我的著作-我可能在10或15年前就參加了課程,但我不記得了-關於如何開始調試它的任何建議? 謝謝!!

COM為聲明自己不支持線程的COM組件提供線程安全保證。 用VB6編寫的任何組件都可以做到這一點。 由注冊表中名為ThreadingModel的條目指示。

您的測試程序無法為此類組件提供安全的家,您的控制台模式應用會創建一個多線程單元,簡稱MTA。 這保證不會提供線程安全性。 然后,COM創建自己的STA線程來運行該組件的代碼。 對組件的每次調用都將從主線程編組到該輔助線程。

但是,如果遇到這種情況,它就會碰壁,您的組件沒有注冊所需的代理/存根。 COM需要弄清楚如何復制該方法的參數的額外代碼。 在.NET中很容易,這要歸功於Reflection,而不是COM。 代理/存根由HKCR \\ Interface注冊表項中的條目選擇,VB6組件始終使用與類型庫一起使用的標准編組器。 E_NOINTERFACE錯誤代碼用於IMarshal接口,這是COM的最后一次嘗試,而不是由VB6實現。

除了獲得正確的注冊之外,臨時幫助使控制台模式應用程序可以創建STA線程而不是MTA線程。 這很容易做到,只需要一個屬性:

[STAThread]
int main(array<System::String ^> ^args)
// etc..

現在,COM不再創建該幫助程序線程,也不必整理呼叫。 實際上這還不夠,STA線程還必須泵送消息循環。 Application :: Run()可能在較大的C#程序中使用。 消息循環提供了封送呼叫的方式,與Control.BeginInvoke()和Dispatcher.BeginInvoke()非常相似。 因為您實際上並沒有從另一個線程對該組件進行調用,所以您可能會放棄它。 但是許多COM組件依靠消息循環來完成自己的工作。 當您看到死鎖或組件未引發事件時,您就會知道有問題。 例如,VB6代碼可以使用計時器,沒有該消息循環就不會打勾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM