2012-04-04 22 views
2

COMクラスを呼び出すC#Winformsアプリケーションがあります。 Visual Studioを使用してデバッグする場合、C++コードにステップインしてS_OKを返しますが、ビジュアルスタジオがハングしてアプリケーションがクラッシュすると関数が返されます。プログラムの実行を停止するには、VSプロセスでプロセスを終了する必要があります。私はビジュアルスタジオの外でアプリを実行する場合、アプリケーションは単にクラッシュします。COMクラスへのメソッド呼び出しでアプリケーションがクラッシュする

すべてがうまくいきましたが、私はこの問題を引き起こす可能性があります。

何か助けていただければ幸いです。

LicenceData data = new LicenceData(); 

ILicenceReader reader = new LicenceReader(); 

reader.ReadLicenceFile(ref data, filePath); 

:ありがとう

Sjの

は、これは私がCOM DLLを参照し、VSがC#アプリケーションで相互運用機能と使用率を生成することができましたインターフェース定義

typedef struct 
{ 
    long ExpiryData 
    BSTR IssuedBy; 
} LicenceData; 

[ 
    object, 
    uuid (5A734F95-EABE-440B-8B7E-0F73538A24AC), 
    pointer_default(unique), 
    helpstring("ILicenceReader Interface"), 
] 
interface ILicenceReader : IDispatch 
{ 
    HRESULT ReadLicenceFile ([in, out]LicenceData* plicenceData, LPCTSTR filePath); 
}; 

[ 
    uuid(C2833A21-6586-4648-ABC8-D42BC3225699)  
] 
coclass LicenceReader 
{ 
    [default] interface ILicenceReader; 
}; 

ですご協力いただきありがとうございます。

+0

おそらく、あなたが行っているCOM通話についての詳細を提供することができますか?さらに、OS、CPUアーキテクチャ(32ビットvs. 64ビット)、コンパイルされたCPUアーキテクチャ(AnyCPUとx86)などに関する情報はすべて参考になるかもしれません。 – Reddog

+0

スタックに問題があると思われます。 COM関数のシグネチャ、C#での宣言方法、呼び出し方法を表示できますか? – Steve

+0

SEHで停止するようにデバッガを設定します(メニュー - >デバッグ - >例外のVS)。デバッガを接続してアプリケーションを実行しますが、ステップバイステップの実行は使用しないでください。何が例外が報告されるかを見る –

答えて

0

私は、COMサブシステムがスタックに割り当てられたBSTRをアンマーシャリングしようとしているか、スタック上にスマートポインタを割り当てている可能性があります。

BSTRをSysAllocStringで割り当てる必要があります。この結果はスタックにないのでそのまま返すことができ、誤って解放しようとするものは何もありません。

CComBSTRや_bstr_tなどのスマートポインタBSTRクラスを使用する場合は、Detsuachを使用してIssuedByメンバを設定する必要があります。 CComBSTR :: Detach()は、BSTRへのポインタを返し、CComBSTRのローカルインスタンスが有効範囲外になったときに解放しようとしません。

plicenceData->IssuedBy = CComBSTR("Some Dude").Detach(); 

もう一つの可能​​性

はあなたが渡されたインスタンスを上書きし、あなたのCOMクラス内plicenceData =新しいplicenceDataような何かをしようということである。それは動作しません。

結局のところ、COM関数が終了して返された後に失敗する唯一の理由は、マーシャリングの問題のためです。それはあなたのC#コードと呼ばれるC++の間のレイヤーで、アパート全体にわたりデータを変換しようとしている可能性があります。あなたはマーシャルがその仕事をすることを可能にするために、あなたが手紙にCOM規則に従うようにする必要があります。

したがって、すべてのポインタを確認してください。それらはスタック上かヒープ上にありますか?彼らはヒープにいる必要があります。すべてのBSTRは適切に割り当てられていますか?スマートBSTRクラスを使用すると、通常は大幅に役立ちますが、生のメンバーを返すことはできません。これらのクラスは、使用予定のクラスを使用してください。