有一个com的函数:sfun(out int),这个i实际上是一个指向函数返回的一个数据块的地址。
但在C#中怎样把数据块copy 到byte[] 中?

解决方案 »

  1.   

    是这样的,:
    int i;
    sfun(out i);
    调用sfun后,i是一个数据块的地址,怎样把数据块放到byte []变量中
      

  2.   

    int?void*?
    用int来表示一个地址?
      

  3.   

    to 
    Ivony() 
    是啊,int 就是一个void *
    那个com是个现成的,我也没有办法.
    我以前在VC下是这样用的.
    CByteArray sc;
    long b;
    sfun(&b);
    HGLOBAL pb = (HGLOBAL )b;
    l = GlobalSize(pb);
    sc.SetSize(l+1); 
    BYTE *pc = (BYTE *) GlobalLock(pb);
    for(long i=0;i<l;i++) sc[i]=pc[i];
    GlobalUnlock(pb);
      

  4.   

    to 
     runrunrun(一条不会游泳の鱼) 
    先要知道返回的数据块的大小,才能copy 数据啊
      

  5.   

    看起来只能用C++/CLI写一个桥接。
      

  6.   

    只能做了一个中间dll来实现,但出现问题源程序:
    C#
    [DllImport("forf1book.dll",EntryPoint="writetolp")] static extern void writetolp ( int ls,int ld,int ilen );
    [DllImport("Kernel32",EntryPoint="GlobalSize")] static extern int GlobalSize ( int lp ); 
    int lp;
    int ilen;

    sfun(out lp);

    ilen = GlobalSize(lp); //长度能正确取出.

    byte[] pb = new byte[ilen];
    fixed(byte* pb1 = &pb[0])
    {
    writetolp(lp,(int )pb1,ilen); 
    //运行时出现未处理的“System.NullReferenceException”类型的异常出现在 ts1.exe 中。
    //其他信息: 未将对象引用设置到对象的实例。
    }vc的dll源程序:
    __declspec(dllexport) void writetolp(int ls,int ld,int ilen)
    {
    HGLOBAL pb = (HGLOBAL )ls;
    GlobalLock(pb);
    CopyMemory((void *)ld,pb,ilen);
    GlobalUnlock(pb);
    }
      

  7.   

    不要传递int类型,改用IntPtr
      

  8.   

    使用API
    [DllImport("Kernel32.dll",EntryPoint="RtlMoveMemory")] 
    public static extern void CopyMemory (byte[] Source,IntPtr Destination,int Length);前提是你得知道你要Copy的Length