C++中接口函数:
HRESULT GetInfo(CHAR* szInfo),在此函数中szInfo返回一段字符串。
在C#中调用此函数时参数该怎么定义才能取到szInfo的值啊,Visual Studio中提示GetInfo(ref sbyte szInfo),但是也不对啊,各位路过的大神帮忙看看,谢谢!

解决方案 »

  1.   

    int GetInfo(StringBuilder szInfo)
      

  2.   

    C++中接口的实现类是OperationClass,我的做法是先注册COM组件,然后添加引用,最后代码中如下:
    OperationClass simOP = new OperationClass();
    simOP.GetInfo(ref sbyte szInfo);请问红色部分的参数该怎么写我才能取到szInfo的值呀
      

  3.   

    为什么要用ref sbyte呢?调用C++要输出字符串的话最简单的是用StringBuider,用byte[]数组以及用IntPtr开辟内存去读也行。
      

  4.   


    根据我这个情况给个具体代码吧(C#初学,C++完全没有接触过),不是我非要用ref sbyte这个啊,因为用其他类型的参数编译都通不过,至于StringBuider、IntPtr以及数组我在网上也看到了,但是根据我这个情况具体该怎么应用呢?
      

  5.   

    返回了sbyte也没关系        public static unsafe string FromSbyte(ref sbyte szInfo)
            {
                fixed (sbyte* tmp = &szInfo)
                {
                    return new string(tmp);
                }
            }
      

  6.   

    如果是用添加Com的方式调用dll,那就麻烦一点了,要修改C++的代码。你看看这个
    http://blog.csdn.net/wheatfield/article/details/5843517
      

  7.   


    强大!这个方法确实可以取到!但是却也报错了:“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”
    我的调用代码如下:
    OperationClass simOP = new OperationClass();
    sbyte szInfo = 0;
    simOP.GetInfo(ref sbyte szInfo);
    string s = FromSbyte(ref s);这是怎么回事呢
      

  8.   

    上面好像写错了吧,那个FromSbyte(ref s);
    另外是哪一行报错的?
      

  9.   

    帖子提交后才发现代码贴的有点问题,但是却编辑不了,不好意思啊
    代码如下:
    1   OperationClass simOP = new OperationClass();
    2   sbyte szInfo = 0;
    3   simOP.GetInfo(ref szInfo);
    4   string s = FromSbyte(ref szInfo);我逐句debug,发现断点设置在第三行前面,那么执行第三行后就会出错,出错内容:“检测到 FatalExecutionEngineError
    Message: 运行库遇到了错误。此错误的地址为 0x79e84ab1,在线程 0xbbc 上。错误代码为 0xc0000005。此错误可能是 CLR 中的 bug,或者是用户代码的不安全部分或不可验证部分中的 bug。此 bug 的常见来源包括用户对 COM-interop 或 PInvoke 的封送处理错误,这些错误可能会损坏堆栈。
    ”,如果断点设置在第三行后面或者不设置断点,那么就直接弹出错误:“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”
      

  10.   

    我猜也是那个地方的错误,因为从sbyte到string的转换不涉及到内存写入。
    你试试给一个缓冲区给它,这样写:
    1 OperationClass simOP = new OperationClass();
    2 sbyte[] szInfo = new sbyte[1024];
    3 simOP.GetInfo(ref szInfo[0]);
    4 string s = FromSbyte(ref szInfo[0]);