【发布时间】:2012-10-29 14:03:51
【问题描述】:
我正在尝试将我的本机 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 调用,或者我是否缺少一些微妙的东西来开始我已经拥有的工作?
谢谢。
【问题讨论】:
-
当前行为是有道理的:因为没有任何迹象表明
outputSize与outputData有任何关系,所以outputData被视为指向单个@987654326 的指针@。不幸的是,我无法帮助你正确地写这个,只能解释当前的行为。 -
是的,这确实是有道理的, outputSize 是为了我在测试中的好处,显然如果 byte[] 知道它应该是什么,那么它就会过时。 :) 无论如何谢谢。
标签: c# .net pinvoke marshalling