RT..其实是在C#中注册了一个VC定义的回调 函数,VC里面使用的是 char*,C#使用的是IntPtr形式如:
OnCallBack(IntPtr pBuf)现在想把这个pBuf转为 string,how TO??? 谢谢有朋友说 还是做一个托管的VC.NET DLL来转。。if so, so faint...3x all.

解决方案 »

  1.   

    string s = Marshal.PtrToStringAuto(pBuf);
      

  2.   

    不知道shrinerain 的方法能不能通过,但在PC上的C#不怎么懂,我只清楚CF下的做法。
    我是这样解决的,首先,因为是读取指针,而CF默认是没有可以读取ansi字符的方法,那只有用回C的方法来做了,可以在传的时候先用前4字节写入该字符串的长度
    ,再把多少长度的字符串写入。在读时可先读 Marshal.ReadInt32 即长度,再用到Marshal.Read 循环可把所有读出
      

  3.   

    to: shrinerain   
    按照你的方法读取出来的s为乱码.. 而VC里面的char* 为手工写的测试数据 "abcdef"请问你有可用的例子吗? 我不知道是否哪里写错了。。但我从VC里面传byte* 指针,其实是图像数据,char*是图像名称而已,byte*就OK,这个是使用memcpy直接拷贝到新的bitmap中去的,怎么char*不能用,真是有点小麻烦。to: hNeed
    Marshal.ReadInt32 读取来为一个巨大的int数 应该是错了。
      

  4.   

    我试了一下 用 Marshal.PtrToStringAnsi 或 Marshal.PtrToStringUni可以。。谢谢。。
      

  5.   

    如果你是VC6.0, 那么你应该用PtrToStringAnsi, 如果你是VC7.0以后, 用PtrToStringAuto
      

  6.   

    很奇怪,第一次使用PtrToStringAnsi OK,第二次居然就不行了另外 往回调函数加了一个参数 int nBufSize表示读取内容的大小 没想到strTmp = Marshal.PtrToStringAnsi( pNumber, nBufSize );居然 pNumber 与 nBufSize 中的内容调换了char* pBuf = new...
    int n = 5;
    如Callback(param_foo, param_bar, pBuf, n);在C#里 居然 pNumber的内容是5,而nBufSize是个大整数 看起来是一个内存地址。。非常汗。。
    我没有指定 调用方式 难道压入堆栈顺序反了??
      

  7.   

    不可能出现这种事...不要告诉我VC里你是char* str="xxx"; 而忘了malloc?
      

  8.   

    char*   pBuf   =   new... 我上面特地注明了我快抓狂了
      

  9.   

    1.仔细检查你的代码, 不论是什么调用方式, 只要你DllImport时没有强制某种方式, C#会自动处理.2.char* 应该封送为String.3.GC会移动内存, 你IntPtr指向的那块内存, 并不能保证每次都能使用, 除非使用fixed.
      

  10.   

    1. dllImport没有指定调用方式 vc也没指定 2. 那就是说 C#的回调函数的声明就直接 把参数声明为string类型就OK?3. 你IntPtr指向的那块内存,   并不能保证每次都能使用
    VC里面所指向的内存,进程声明周期内是固定的,因为只new了一次,而且是vc dll,c# exe,所以你说的“并不能保存每次都能使用”是指C#这边的内存管理的问题吗?明天再看看了,谢了。
      

  11.   

    2.char*   应该封送为String. 在C#中将参数声明为string类型,也一样的问题,如VC6里面buffer内容是 abcdef,到了C#确实 P? 这样的东西。。小郁闷。。
      

  12.   

    我测试过 用StringBuilder来进行与DLL的交互是可以但我这种情况是回调,就是C++中分配内存 .NET外部进行拷贝,而不是.NET分配内存,然后C++进行填充
    这样就不行了结贴。