ネイティブ dll が CoTaskMemAlloc を介して割り当てたデータを C# アプリケーションにマーシャリングしようとしていますが、その方法が単純に間違っているのか、メソッド C# 側の微妙な装飾が欠けているのか疑問に思っています。
現在、私はc ++側を持っています。
extern "C" __declspec(dllexport) bool __stdcall CompressData( unsigned char* pInputData, unsigned int inSize, unsigned char*& pOutputBuffer, unsigned int& uOutputSize)
{ ...
pOutputBuffer = static_cast<unsigned char*>(CoTaskMemAlloc(60000));
uOutputSize = 60000;
そしてC#側。
private const string dllName = "TestDll.dll";
[System.Security.SuppressUnmanagedCodeSecurity]
[DllImport(dllName)]
public static extern bool CompressData(byte[] inputData, uint inputSize, out byte[] outputData, out uint outputSize );
...
byte[] outputData;
uint outputSize;
bool ret = CompressData(packEntry.uncompressedData, (uint)packEntry.uncompressedData.Length, out outputData, out outputSize);
ここで、outputSize は予想どおり 60000 ですが、outputData のサイズは 1 です。バッファー C++ 側を memset すると、1 バイトしかコピーしないように見えるので、これは間違っているのでしょうか。 IntPtr + outputSize、または私がすでに持っているものを機能させるために欠けているものはありますか?
ありがとう。