2011-10-19 15 views
-1

.dllリファレンスでメソッドを使用中にこのエラーが発生しました。 MyRef.SetDbaseIdメソッドを呼び出すと、このエラーでVSに返されます。私はCallingConvention列挙型パラメータを追加しようとしましたが、それらのすべてが私のためには機能しません。 DependencyWalkerでDLLを開いて、アプリケーションに合うエントリポイントとパラメータ(ulong)を確認しました。他の方法がうまく動作するので混乱します。任意のアイデアはどのようにこの問題を解決するには? ?あなたの宣言が間違っている可能WPF:PInvoke関数の呼び出しでスタックのアンバランスが発生しました

int __stdcall setdbaseid(unsigned long); 

、ネイティブコードで符号なしlongは32ビットです:

[DllImport("my.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "[email protected]@[email protected]")] 
public static extern int SetDbaseID(ulong dbase_id); 
ulong tmid = ulong.Parse(p_6); 
i = MyRef.SetDbaseID(tmid); 
+2

あなたの宣言が間違っています。あなたが間違ったことを正確に推測することは不可能になります。ネイティブコードの長いC#のintです。 –

+0

EntryPoint =?setdbaseid @@ YGHK @ Zを使用する必要がある場合は、おそらくあなたのdllが "extern C"宣言でエクスポートを宣言していないことを意味します。私が知っていることから、それはdllimportでうまくいくのは非常に難しいです。 dumpbin.exe/exportsを使用して、dllが実際にエクスポートするものを確認しましたか? – stombeur

答えて

2

マングルされた名前は、setdbaseid @@ YGHKはZ @にデマングル。そして、呼び出し規約は間違っています。修正:

[DllImport("my.dll", EntryPoint = "[email protected]@[email protected]"))] 
public static extern int SetDbaseID(uint dbase_id); 
+0

おそらく、 'cdecl'ではなく' stdcall'に戻ってしまうでしょう。 – shambulator

+1

良い点が追加されました。 –

+0

@Hans Passantこれは私のために働いた!あなたはこの外部の方法をどのように崩壊させたのか教えてください。特別な道具を使いましたか? –

関連する問題