我有一个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 ,我更加晕了,麻烦好心人给我提示一下。

解决方案 »

  1.   

    我是做C++的,加密,压缩等库函数现在都已经有了,现在要给网络组提供可用的库,因此我需要用C#封装这些函数,结果发现完全没有能力做到,因此请教。第一次在C#发帖,只能给100分。还挺做过这种事情的人提示一下。
      

  2.   

    ref byte srcBuf,//传一个byte类型的变量
    int buflen,//传一个int类型的变量
    intPtr destBuf,传一个IntPtr类型的变量即可;
    ref int destLen//伟一个int类型的变量;
      

  3.   

    我是做C++的,加密,压缩等库函数现在都已经有了,现在要给网络组提供可用的库,因此我需要用C#封装这些函数,结果发现完全没有能力做到,因此请教。第一次在C#发帖,只能给100分。还挺做过这种事情的人提示一下。
      

  4.   

    问题是我怎么传入参数啊,第一个参数是一个BUFFER控件,不是 ref buf。
      

  5.   

    我现在怀疑不能这么使用COM了,C#中,可能得用DllImport来调用含有指针的函数。从转换的参数来看,把一个指针指向的BYTE内存 转换成了一个 ref BYTE, 这本身就已经不对了。
      

  6.   

    C#认识您的BUFFER控件吗?
    可以像楼上说的导入,也可以重新修改你的接口声明;
    不知道还有没有其它更好的方法;
      

  7.   

    C#认识您的BUFFER控件吗?
    可以像楼上说的导入,也可以重新修改你的接口声明;
    不知道还有没有其它更好的方法;
      

  8.   

    一般写法:
    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); 
      

  9.   

    我现在已经把unsafe加上了。说白了,就是个 托管与非托管 参数之间的转换问题,可是问了好几个C#的同事,竟然都不会。难道大部分写C#的人都只用到了一些基本的代码吗?对系统函数的调用什么的,几乎就不涉及?我真的觉得很不可思议。
      

  10.   


    其实可以调用的,Zip(buf[0], buf.Length, ......)
    理解问题而已,ref其实就是传地址的意思,你把buf[0]的地址传进去就可以了,其他的参数参考参考,主要思路正确,多试几次肯定可以的。