2017-02-14 24 views
0

私はC++ DLL内のC++ DLL渡すバイト配列*

へのC#からbyte[]を渡しています、私は受け入れ、istreamオブジェクトを読み取る関数を呼び出す必要があり、私が受け取るつもりchar*としてのC#からbyte[]istreamに変換し、

C++ DLL

extern "C" _declspec(dllexport) bool CheckData(char* data, int dataLength) 

C#

[DllImport("example.dll", CallingConvention = CallingConvention.Cdecl)] 
public static extern bool CheckData(byte[] incoming, int size); 

public void Process(byte[] bytes) 
{ 
    CheckData(bytes, bytes.Length); 
} 

正常に動作するようですが、私はbyte[]の同等のデータ型はC++でunsigned char*であることがわかり、私はunsigned char*への変更を考えたが、私はしたいと思いますchar*ないunsigned char*

上で動作++ Cで最もstream ask

1)データ型はchar*unsigned char*のいずれも1バイトですが、どうしたのでしょうか? char*byte[]を引き続き使用しても問題はありますか?

2)問題が発生した場合、オブジェクトの作成にはunsigned char*をどうすればよいですか?

+1

お持ちのとおりです。 –

+0

あなたは何が起こっているのか知っていますか?私は何が起こったのか理解したかった –

+1

何も起こりません。事実上再解釈があります。 –

答えて

1

実際には、win32アプリケーションについて言えば、タイプ・サイズは1バイトではなく、4バイトです。これらはポインタであり、すべてのポインタはデータのサイズに関係なく同じサイズです指さしている。

P/Invokeメカニズムが関数の引数として "単純な値"の配列を見ると、配列の先頭にあるポインタを下のC関数に送ります。結局のところ、はすべて、実際にはというDLLの情報からC関数について知っています。私が知る限り、引数の数と型はシンボル名にエンコードされていないので、あなたが提供した情報を信頼します。つまり、int配列を与えても、スタックにプッシュされた引数のサイズ(ポインタとint)が関数のABIと一致するため、C関数への実際の呼び出しが機能していたはずです。もちろん、サイズが一致しないため、処理が間違っている可能性があります。

は何が起こるかの詳細についてもhttps://msdn.microsoft.com/en-us/library/75dwhxf7(v=vs.110).aspx参照してください。

unsigned charcharの違いは出番処理がある:あなたが(0-255の範囲)byte値にいくつかの計算を行うC#のサイズの場合、char値(-128〜127)C側にそれを渡します いくつかの数学を行うことが期待されている、何かが間違って行く可能性があります。データを移動する方法としてそれを使用するだけなら、それはすべて問題ありません。

関連する問題