たとえば、DLL で公開されている関数のプロトタイプがあるとします。
int CALLBACK worker (char* a_inBuf, int a_InLen,
char** a_pOutBuf, int* a_pOutLen,
char** a_pErrBuf, int* a_pErrLen)
私の C# コードからその DLL 関数を呼び出すのはとてつもなく簡単だと確信していますが、このコードでは機能しません。
[DllImport("mydll.dll")]
public static extern int worker(
[In, MarshalAs(UnmanagedType.LPArray)] byte[] inBuf,
int inputLen,
[Out, MarshalAs(UnmanagedType.LPArray)] byte[] outBuf,
out int outputLen,
[Out, MarshalAs(UnmanagedType.LPArray)] byte[] errBuf,
out int errorLen);
...
int outputXmlLength = 0;
int errorXmlLength = 0;
byte[] outputXml = null;
byte[] errorXml = null;
worker(input, input.Length, output, out outputLength, error, out errorLength);
アンマネージ ライブラリのメモリを取得しようとすると、アクセス違反が発生します (したがって、渡されたポインタを逆参照しますoutput
) 。error
*a_ppBuffer = (char*) malloc(size*sizeof(char));
DLLIMPORT
この関数の C# コードにステートメント を記述するにはどうすればよいですか?関数を実際に呼び出すにはどうすれば と に
a_pOutBuf
アクセスa_pErrBuf
できnull
、内部からではなくworker
(つまり、実際のダブル ポインターを使用する) ことができますか?