9

こんにちは、呼び出す必要のある関数を含む DLL があります。署名は次のとおりです。

const char* callMethod(const char* key, const char* inParams);

Ruby を使用すると、すべて正常に動作します。

attach_function :callMethod, [:string, :string], :string

C++ または C# を使用すると、スタック オーバーフローが発生します!?

C#:

[DllImport("DeviceHub.dll", CallingConvention = CallingConvention.Cdecl)]
private unsafe static extern IntPtr callMethod(
    [MarshalAs(UnmanagedType.LPArray)] byte[]  key,
    [MarshalAs(UnmanagedType.LPArray)] byte[] inParams
);

System.Text.UTF8Encoding encoding = new UTF8Encoding();
IntPtr p = callMethod(encoding.GetBytes(key), encoding.GetBytes(args)); // <- stack overflow here

c++:

extern "C"
{
typedef  DllImport const char*  (  *pICFUNC) (const char*, const char*); 
}
HINSTANCE hGetProcIDDLL = LoadLibrary(TEXT("C:\\JOAO\\Temp\\testedll\\Debug\\DeviceHub.dll"));  
FARPROC lpfnGetProcessID = GetProcAddress(HMODULE (hGetProcIDDLL),"callMethod");*      pICFUNC callMethod;
callMethod = (pICFUNC) lpfnGetProcessID;
const char * ptr = callMethod("c", "{}");

関数呼び出しのさまざまなバリエーションを試しました: WINAPI、PASCAL、stdcall、fastcall... 何も機能しません。

DLL は私が作成したものではなく、私が制御することはできません。

誰でも私に何か提案を手伝ってもらえますか!?

4

4 に答える 4

1

ヘッダーの宣言が extern "C" ブロックで囲まれていることを確認してください。

extern "C" {

const char* callMethod(const char* key, const char* inParams);

}

http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html#faq-32.3を参照してください。

于 2012-05-03T23:55:04.000 に答える
1

これは単なるアイデアですが、知る限り、これはヌル終了文字列の問題である可能性があり、const char* myvarヌル終了ですが、バイト配列はそうではありません。必要なのは、呼び出しを に変更し、...(String a, String b)それらを としてマーシャリングすることだけLPStrです。

于 2012-05-04T07:49:42.803 に答える
0

電話をに変更してはいけない理由はわかりません

[DllImport( "DeviceHub.dll"、CallingConvention = CallingConvention.Cdecl)]
private unsafe static extern string callMethod(
string key、
string inParams
);

関数に実際の値/バイトではなく、ポインターを送信する必要があります。ネイティブ関数呼び出しの型変換を生成するときは、
常にこのマッピングを使用します。
同じことがC++コードにも当てはまります。コンテンツを使用して変数を作成し、関数を呼び出す必要があります。

于 2012-05-04T08:10:55.427 に答える
-5

スタック オーバーフロー例外は、無限再帰を防ぎ、互換性のないプログラムが相互に対話するのを防ぐために Microsoft 言語に挿入されるエラーです。dll メソッドが再帰を使用している場合は、繰り返しで書き直してみてください。それ以外の場合は、Ove が言ったようにして、文字列で試してください。それでもうまくいかない場合は、Google で互換性のあるタイプを探してください。実際の方法を知らなくても言えるのはそれだけです。

于 2012-05-03T23:30:04.740 に答える