2012-03-22 21 views
1

C#でCOMオブジェクトwtittenを取得しましたが、これをC++ DLLで使用しています。 COMオブジェクトが#import derectivec#COMオブジェクト& "ESPの値が関数呼び出しで正しく保存されませんでした..."

問題でインポートされ

C言語で

は++でその呼び出しは、私は、ランタイムチェックエラーになっていますCOMオブジェクトの任意の関数にC++ DLLから作られるとき:

を 私がでdeclatedている:C++ importディレクティブによって生成されたCOMオブジェクトラッパーで

Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.

は、すべての機能が__stdcall

+0

可能重複http://stackoverflow.com/questions/4104774/the-value- of-esp-was-not-saved-properly) –

+1

これはCOMコールでは非常に珍しい問題です。呼び出し規約と引数タイプはすべてマシン生成です。コードの記述、C#宣言とC++呼び出しのスニペットを少なくとも投稿する必要があります。簡単な説明は、古いバージョンの型ライブラリを使用していることです。 –

+0

私は解決策を見つけたようです: c#COMのすべてのメソッドとパラメータのIn/Out/MarshalAs属性を宣言しました – ili

答えて

1

OKとして宣言されている、それは私が解決策を見つけたように見えます/アウト/ MarshalAsはC#COMインタフェースのすべてのメソッド属性:([ESPの値が正しく保存されませんでした]の

[Guid("EEB4C1AE-4DB2-4bdb-86D4-A429B27496A3")] 
public interface IAXFarCards 
{ 
    [DispId(1)] 
    void InitDbConnection([In, MarshalAs(UnmanagedType.BStr)] string connectionString); 

    [DispId(2)] 
    [return: MarshalAs(UnmanagedType.I4)] 
    int GetCardInfo(
     [In, MarshalAs(UnmanagedType.BStr)]    string card, 
     [In, MarshalAs(UnmanagedType.VariantBool)]  bool isTemplate, 
     [In, MarshalAs(UnmanagedType.I4)]    int cashDeskId, 
     [Out, MarshalAs(UnmanagedType.VariantBool)] out bool isActive, 
     [Out, MarshalAs(UnmanagedType.I4)]   out int discountNumber, 
     [Out, MarshalAs(UnmanagedType.I8)]   out Int64 amount, 
     [In, Out, MarshalAs(UnmanagedType.BStr)] ref string ownerName, 
     [In, Out, MarshalAs(UnmanagedType.I4)]  ref int clientId 
     ); 
関連する問題