dll函数中的输入和输出参数都有CString,该如何定义?
[DllImport("xx.dll", EntryPoint = "GetWord", CharSet = CharSet.Auto)]
        public static extern IntPtr GetWord(IntPtr str, int nHandle);
string word = Marshal.PtrToStringAuto(GetWord(Marshal.StringToHGlobalAuto(strText), nCount));返回的是乱码,日
求解决方案!

解决方案 »

  1.   

    using System.Runtime.InteropServices;[DllImport("XXX.DLL",EntryPoint="GetApiFunction",SetLastError=true)]
    public static extern int GetApiFunction(
        string strParaA,
        StringBuilder strParaB,
        int intParaC,
        out int intParaD,
        bool blnParaE);C++数据类型和C#的部分对应关系:C++           输入输出    C# 
    ==================================
    char chr[255]   O    StringBuilder
    KCA_DIR         I    int
    LPCSTR          I    string
    int             I    int
    LPSTR           O    StringBuilder
    int*            O    out int
    DWORD           I    int
    DWORD*          O    out int
    BOOL            I    bool
    Rc_DBMgr        I    IntPtr
    long*           O    out long
      

  2.   

    如果是CString,你可以先用StringBuilder去试一下;
    如果不行,看看dll是否能转换参数类型,即把Cstring用char*来代替。
      

  3.   

    StringBuilder不行..
    转换参数类型?Cstring用char*?怎么做?这个是第三方的dll啊
      

  4.   

    Cstring是object,不同于char*。你可以用vc再包一层,把cstring参数改成char*。
      

  5.   

    打开CString的类定义,自己依样在C#中定义一个类,内存布局和CString同。
    CString中的char* 用 StringBuilder 替,
      

  6.   

    CharSet=CharSet.Auto 可能不行,换成CharSet=CharSet.Ansi
      

  7.   

    果然还是要再挂一个dll,靠...
    先试下吧,可以再来冒个泡有好方法也继续关乎啊
      

  8.   

    这也是提供dll的人做得不标准,采用mfc才有的类型进行输出,这让任何非vc程序调用起来都很麻烦。
      

  9.   

    我晕,搞笑啊!
    我再挂个dll做tmp居然也是乱码
    CString word = GetWord(hHandle, index);//从原始的dll里取
    char* str = word.GetBuffer(word.GetLength());//这部我直接在VC里调试过,取值是正确的啊
    return str;
    如果是直接char* str="中文"; return str;就没问题!来人啊..救命..
      

  10.   

    CString word = GetWord(hHandle, index);//从原始的dll里取
    这里取出来是否正确呢
      

  11.   

    我专门建了个项目用于直接调用原始的dll
    CString word = GetWord(hHandle, index);//
    char* str = word.GetBuffer(word.GetLength());//
    就在里边,跟踪发现没有任何问题.
    把这同一段代码拷贝到外套dll里,由于不能跟踪到里面,但是有理由认为取到了正确的值(与上面相比,没有特殊的地方)
    结果就是得不到中文...
      

  12.   

    可以试试如下:
    CString word = GetWord(hHandle, index);
    char* str = new char[word.GetLength()];
    strcpy( str, word.GetBuffer(word.GetLength() );
    return str;
      

  13.   

    哈哈,可以也!
    真是百思不得其解呀,这种方式和我的赋值方式应该是一致的啊,为什么我的那种就不行呢?
    不过问题总算解决了!那个破组件商,诅咒他出门被车撞!谢谢Knight94(愚翁) 老哥了!
      

  14.   

    结帐咯~~
    有谁知道我错在哪的,PM我,我再给100分!
    这里的100分毫无疑问都是给Knight94的了:)