我有一个C++写好的COM,提供了以下3个函数:bool Zip(BYTE* srcBuf, int buflen, BYTE** destBuf, int *destLen);
bool UnZip(BYTE* zipBuf, int ziplen, BYTE** destBuf, int *destLen);
bool Free(BYTE* destBuf);Zip()中将根据给入的BUFFER,进行压缩,压缩结果由COM里面 malloc 出来的,所以需要调用 Free()进行释放。我把这个COM引入到C#工程之后,发现参数竟然变成这样了。bool Zip(ref byte srcBuf, int buflen, IntPtr destBuf, ret int destLen);天啦,我该怎么做呢?第一个参数我就没搞定,我用 byte[] buf = new byte[100],将 buf传入,就不认,编译器提示我 不能将 byte[] 转换为 ref byte,后面的 IntPtr ,我更加晕了,麻烦好心人给我提示一下。
bool UnZip(BYTE* zipBuf, int ziplen, BYTE** destBuf, int *destLen);
bool Free(BYTE* destBuf);Zip()中将根据给入的BUFFER,进行压缩,压缩结果由COM里面 malloc 出来的,所以需要调用 Free()进行释放。我把这个COM引入到C#工程之后,发现参数竟然变成这样了。bool Zip(ref byte srcBuf, int buflen, IntPtr destBuf, ret int destLen);天啦,我该怎么做呢?第一个参数我就没搞定,我用 byte[] buf = new byte[100],将 buf传入,就不认,编译器提示我 不能将 byte[] 转换为 ref byte,后面的 IntPtr ,我更加晕了,麻烦好心人给我提示一下。
int buflen,//传一个int类型的变量
intPtr destBuf,传一个IntPtr类型的变量即可;
ref int destLen//伟一个int类型的变量;
可以像楼上说的导入,也可以重新修改你的接口声明;
不知道还有没有其它更好的方法;
可以像楼上说的导入,也可以重新修改你的接口声明;
不知道还有没有其它更好的方法;
bool Zip([MarshalAS(UnmanagedType.LPArray)]byte[] srcBuf, int buflen,out IntPtr destBuf, out int destLen);
bool UnZip([MarshalAS(UnmanagedType.LPArray)]byte[] zipBuf, int ziplen,out IntPtr destBuf, out int destLen);
bool Free(IntPtr destBuf);
这种比较烦,处理byte**要大量的用到Marshal的那几个非托管内存处理函数.
如果LZ的代码允许unsafe,那就简单得多了:bool Zip([MarshalAS(UnmanagedType.LPArray)]byte[] srcBuf, int buflen,byte** destBuf, out int destLen);
bool UnZip([MarshalAS(UnmanagedType.LPArray)]byte[] zipBuf, int ziplen,byte** destBuf, out int destLen);
bool Free(byte* destBuf);
其实可以调用的,Zip(buf[0], buf.Length, ......)
理解问题而已,ref其实就是传地址的意思,你把buf[0]的地址传进去就可以了,其他的参数参考参考,主要思路正确,多试几次肯定可以的。