c++生成一个DLL,其中有函数如:
extern "c" __declspec(Dllexport) bool EnumDevice(char** cArrayDevice);
改函数,通过传入的char指针,填充数组
在c#中通过:
[DllImport("XXX.dll")]
public static extern bool EnumDevice(string[] cArrayDevice);
来调用,可是string类型不能得到返回值是为什么呢,使用什么数据类型才能得到返回值呢?同样,我将c++的函数,改成
extern "c" __declspec(Dllexport) bool EnumDevice(char* cArrayDevice);
将c#的调用改成
[DllImport("XXX.dll")]
public static extern bool EnumDevice(string cArrayDevice);
cArrayDevice仍旧不能得到返回值...请大侠指点,不胜感激!!!

解决方案 »

  1.   

    public static extern bool EnumDevice( [In, Out] string[] cArrayDevice);
      

  2.   

    http://www.dotnet247.com/247reference/msgs/5/25089.aspx
      

  3.   

    have a try![DllImport("XXX.dll")]
    public static extern bool EnumDevice([Out]StringBuilder[] cArrayDevice);or [DllImport("XXX.dll")]
    public static extern bool EnumDevice( [Out]IntPtr[] cArrayDevice);
      

  4.   

    使用
    extern "c" __declspec(Dllexport) bool EnumDevice(char* cArrayDevice);[DllImport("XXX.dll")]
    public static extern bool EnumDevice([Out]StringBuilder cArrayDevice);
    能正确取到返回值
    可是当把参数替换为数组的时候,就会发生一个内存不可写的错误extern "c" __declspec(Dllexport) bool EnumDevice(char** cArrayDevice);[DllImport("XXX.dll")]
    public static extern bool EnumDevice([Out]StringBuilder[] cArrayDevice);错误描述
    Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
      

  5.   

    extern "c" __declspec(Dllexport) bool EnumDevice(char** cArrayDevice);
    public static extern bool EnumDevice( [In, Out] string[] cArrayDevice);
    这样不行吗
      

  6.   

    StringBuilder[] aryDev = new StringBuilder[10];
                for (int i = 0; i < 10; ++i)
                {
                    aryDev[i] = new StringBuilder();
                }
                
                EnumModem(aryDev);
      

  7.   

    Have a try!
    StringBuilder[] aryDev = new StringBuilder[10];
    for (int i = 0; i < 10; ++i)
    {
         aryDev[i] = new StringBuilder(256);
    }EnumModem(aryDev);
      

  8.   

    仍旧是内存不能写的错误......
    在c++的dll中,我是这样使用传入的参数的:
    ::strcpy(strDevArray[i], lpRasDevInfo[i].szDeviceName);
      

  9.   

    Have a try!
    [DllImport("XXX.dll")]
    public static extern bool EnumDevice( [Out]IntPtr[] cArrayDevice);//Call
    IntPtr[] cArrayDevice = new IntPtr[10];
    for( int i = 0; i < 10; ++i )
    {
        cArrayDevice[i] = Marshal.StringToCoTaskMemAuto( new string( 256 ) );
    }
    EnumModem(aryDev);//Get string using "Marshal.PtrToStringAuto"
    //Don't forget to release memory using "Marshal.FreeCoTaskMem"
      

  10.   

    Marshal.PtrToStringAuto替换成Marshal.PtrToStringAnsi,得到正确值了,谢谢各位大侠!!!