C++ 写的DLL,但是遇到有CString 类型,调用发生错误,经查,各位高手都说需要在C++ 里将其改为char *;我的C++函数如下:
BYTE SecurityAccess (BYTE Level,char* keyorseed) //designed at 2008.9.22
{
InitSendFrame(2);//初始化CAN桢
Sendframeinfo.Data[0] =0X02;
Sendframeinfo.Data[1] =0X27;
Sendframeinfo.Data[2] =Level;// 55 普通权限 57开发权限
Sendframeinfo.Data[3] =0XFF;
Sendframeinfo.Data[4] =0XFF;
Sendframeinfo.Data[5] =0XFF;
Sendframeinfo.Data[6] =0XFF;
Sendframeinfo.Data[7] =0XFF;
CleanReceive15765Data();//清除接收缓冲区对应的数据
if(SendData())//下发数据成功
{
int timecount =0;
do
{
Sleep(10);
timecount++;
if(Re15765framinfo->Data[1]==0x67)
{
CString temp1,temp2,temp3;
temp1 = IntToHex(Re15765framinfo->Data[3],1);
temp2 = IntToHex(Re15765framinfo->Data[4],1);
temp3 = temp1+temp2;
keyorseed = temp3.GetBuffer(temp3.GetLength());
//现在将其改为char*
return 1;
}
if(Re15765framinfo->Data[0]==0X7F)
{
return 0;//反馈
}
}while(timecount <100);
return 254;//反馈数据超时1000ms
}
else
{
return 255;//物理连接断开,下发数据不成功
}
}
如上,本来原来的函数返回值是CString ,以及参数keyorseed 也是CString 为了在C#里调用,我返回值改成 BYTE, keyorseed 改为了char *请问该如何在C#里对此函数操作??
我的方法:
byte Response;
char[] Receivepump = new char[10];
fixed (char* bf = &Receivepump[0])
Response = CANLINK.SecurityAccess(2, 0x57, bf);编译成功,经执行,发现Receivepump 里的值并没变化。
请问高手,SecurityAccess 该如何在C#里调用,而且在C# 里如何把char* 转换为string 呢??或者告诉可行的C++ 函数返回值与参数都带有CString 类型,该如何更改以便于c#调用.希望有做过CString 调用的赐教
BYTE SecurityAccess (BYTE Level,char* keyorseed) //designed at 2008.9.22
{
InitSendFrame(2);//初始化CAN桢
Sendframeinfo.Data[0] =0X02;
Sendframeinfo.Data[1] =0X27;
Sendframeinfo.Data[2] =Level;// 55 普通权限 57开发权限
Sendframeinfo.Data[3] =0XFF;
Sendframeinfo.Data[4] =0XFF;
Sendframeinfo.Data[5] =0XFF;
Sendframeinfo.Data[6] =0XFF;
Sendframeinfo.Data[7] =0XFF;
CleanReceive15765Data();//清除接收缓冲区对应的数据
if(SendData())//下发数据成功
{
int timecount =0;
do
{
Sleep(10);
timecount++;
if(Re15765framinfo->Data[1]==0x67)
{
CString temp1,temp2,temp3;
temp1 = IntToHex(Re15765framinfo->Data[3],1);
temp2 = IntToHex(Re15765framinfo->Data[4],1);
temp3 = temp1+temp2;
keyorseed = temp3.GetBuffer(temp3.GetLength());
//现在将其改为char*
return 1;
}
if(Re15765framinfo->Data[0]==0X7F)
{
return 0;//反馈
}
}while(timecount <100);
return 254;//反馈数据超时1000ms
}
else
{
return 255;//物理连接断开,下发数据不成功
}
}
如上,本来原来的函数返回值是CString ,以及参数keyorseed 也是CString 为了在C#里调用,我返回值改成 BYTE, keyorseed 改为了char *请问该如何在C#里对此函数操作??
我的方法:
byte Response;
char[] Receivepump = new char[10];
fixed (char* bf = &Receivepump[0])
Response = CANLINK.SecurityAccess(2, 0x57, bf);编译成功,经执行,发现Receivepump 里的值并没变化。
请问高手,SecurityAccess 该如何在C#里调用,而且在C# 里如何把char* 转换为string 呢??或者告诉可行的C++ 函数返回值与参数都带有CString 类型,该如何更改以便于c#调用.希望有做过CString 调用的赐教
C++里直接写就OK了,但是C#该如何把char* 转string 呢?
string sj = new String(i);
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 1)]
public struct Parameter
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string Name;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string Value;
};但非固定长度的字符串就必须把每个字节从内存拷贝出来了。很多文章都介绍了具体实现,比如: http://www.seoszcn.com/article/csharp/csharp2009061903.asp