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仍旧不能得到返回值...请大侠指点,不胜感激!!!
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仍旧不能得到返回值...请大侠指点,不胜感激!!!
public static extern bool EnumDevice([Out]StringBuilder[] cArrayDevice);or [DllImport("XXX.dll")]
public static extern bool EnumDevice( [Out]IntPtr[] cArrayDevice);
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.
public static extern bool EnumDevice( [In, Out] string[] cArrayDevice);
这样不行吗
for (int i = 0; i < 10; ++i)
{
aryDev[i] = new StringBuilder();
}
EnumModem(aryDev);
StringBuilder[] aryDev = new StringBuilder[10];
for (int i = 0; i < 10; ++i)
{
aryDev[i] = new StringBuilder(256);
}EnumModem(aryDev);
在c++的dll中,我是这样使用传入的参数的:
::strcpy(strDevArray[i], lpRasDevInfo[i].szDeviceName);
[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"