2011-01-21 2 views
0

私のコードに少し問題があります。私はアンマネージドC++ .dllを持っています。これはC#アプリケーションで使用したいものです。 DLL内署名がOKの間にPInvokeStackBalanceが検出され続ける

C++関数は次のようになります。

void EXPORT_API vSetLights(BYTE byLights) 
{ 
    remote.SetLEDs(byLights); 
} 

C#のコードは次のようになります。

[DllImport("APlugin")] 
    private static extern void vSetLights(byte byLights); 

そして、私はこのような関数を呼び出す:

 byte byLeds = 0x0; 
     vSetLights(byLeds); 

私が正しい場合、関数の署名はOKです(どちらも返さず、バイトが必要です)が、PInvokeStackBalanceはpを保持しますうんざり。その後、アプリケーションはうまく動いてしまいます。それをifnoreで安全に修正できますか?

おかげで、

ウェズリー

+1

あなたはEXPORT_APIの定義を提供する必要があります。 – Puppy

答えて

2

あなたのスタックの不均衡は、おそらく呼び出し規約の違いによって引き起こされます。 DllImportのデフォルトの呼び出し規約はWinApi(デフォルトではStdCall)です。あなたのC++関数がCdecl呼び出し規約を使用している可能性があります。確実にするには、EXPORT_APIの定義を表示する必要があります。

StdCallは呼び出された関数がスタックをクリーンアップすることを期待しており、Cdeclは呼び出し元がスタックをクリーンアップすることを期待しているためにスタックの不均衡が発生します。したがって、StdCallを期待するプログラムがCdecl関数を呼び出すと、スタックはクリーンアップされません。他の方法(Cdecl呼び出すStdCall)に行くと、スタックは2回クリーンアップされます。

あなたはこのように、Cdeclを使用するようにDllImportを変更することができます。

[DllImport("APlugin", CallingConvention=CallingConvention.Cdecl)]

+0

EXPORT_APIは実際には__declspec(dllexport)として定義されていました。あなたの答えをありがとう、私は今日新しい事を学びました。 – WesleyE

関連する問題