求救:C++简单问题求解(没有用过C++,请各位高手帮忙,小女子感激不尽!)

Cristinays 2011-09-03 05:35:35
struct STRUCT_C2D_IN
{
char chDev[21];
char chWord[21];
BYTE bytCh;
char chAddr[30];
WORD wPort;
WORD wSeq;
UINT uCmd;
BYTE bytFmt;
UINT uLen;
BYTE bytData[1024];

STRUCT_C2D_IN()
{
ZeroMemory(this, sizeof(STRUCT_C2D_IN));
}
};
error C2814: “Drivers::CreateDriver::STRUCT_D2C_IN”: 本机类型不能嵌套在托管类型“
...全文
145 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Cristinays 2011-09-04
  • 打赏
  • 举报
回复
extern "C" BOOL D2C(BYTE* lpIn, BYTE* lpOut)
{
STRUCT_D2C_IN sIn=*(STRUCT_D2C_IN*)lpIn;
STRUCT_D2C_OUT sOut;

sIn.uLen=(sIn.uLen&0xFF000000)/0x1000000+(sIn.uLen&0xFF0000)/0x100+(sIn.uLen&0xFF00)*0x100+(sIn.uLen&0xFF)*0x1000000;
if(sIn.uLen>1024)
return FALSE;
switch(Data[1])
{
case 0X80: //位置数据
sOut.bytType=ChangeFlag(Data[8]);
switch(sOut.bytType)
{
case 0X01:
sOut.uType=GCCP_OPRATION_INFO;
break;
case 0X02:
case 0X03:
case 0X04:
case 0X16:
case 0X17:
case 0X18:
sOut.uType=GCCP_ALARM_INFO;
break;
case 5:
sOut.uType=GCCP_CALLING_INFO;
break;
default:
sOut.uType=GCCP_POSITION_INFO;
break;
}
sOut.wSeq=(WORD)Byte2Uint(0, 0, Data[10], Data[9]);
//数据条数
sOut.bytData[0]=Data[11];
for(i=0; i<Data[11]; i++)
{
m=36*i+12;
n=29*i+1;
//定位星数
if(Data[m+3]==0XA1)
sOut.bytData[n]=4;
else
sOut.bytData[n]=2;
//日期
sprintf(Temp, "%02X", Data[m+27]);
sOut.bytData[n+1]=(BYTE)atoi(Temp);
sprintf(Temp, "%02X", Data[m+26]);
sOut.bytData[n+2]=(BYTE)atoi(Temp);
sprintf(Temp, "%02X", Data[m+25]);
sOut.bytData[n+3]=(BYTE)atoi(Temp);
//时间
sprintf(Temp, "%02X", Data[m]);
sOut.bytData[n+4]=(BYTE)atoi(Temp);
sprintf(Temp, "%02X", Data[m+1]);
sOut.bytData[n+5]=(BYTE)atoi(Temp);
sprintf(Temp, "%02X", Data[m+2]);
sOut.bytData[n+6]=(BYTE)atoi(Temp);
AdjustTime(&sOut.bytData[n+1], 8);
//纬度
sprintf(Temp, "%02X%02X.%02X%02X%02X", Data[4+m], Data[5+m], Data[7+m], Data[8+m], Data[9+m]);
memset(Buf, 0, 20);
memmove(Buf, Temp, 2);
d=atof(Buf);
memset(Buf, 0, 20);
memmove(Buf, Temp+2, 8);
d+=atof(Buf)/60;
d=314159266*d/180; //0183格式转换成二进制
if(Data[10+m]==0XA4)
d=-d;
sOut.bytData[n+7]=LOBYTE(LOWORD((int)d));
sOut.bytData[n+8]=HIBYTE(LOWORD((int)d));
sOut.bytData[n+9]=LOBYTE(HIWORD((int)d));
sOut.bytData[n+10]=HIBYTE(HIWORD((int)d));
//经度
sprintf(Temp, "%02X%02X%02X.%02X%02X%02X", Data[11+m], Data[12+m], Data[13+m], Data[15+m], Data[16+m], Data[17+m]);
memset(Buf, 0, 20);
memmove(Buf, Temp, 4);
d=atof(Buf);
memset(Buf, 0, 20);
memmove(Buf, Temp+4, 8);
d+=atof(Buf)/60;
d=314159266*d/180; //0183格式转换成二进制
if(Data[18+m]==0XA7)
d=-d;
sOut.bytData[n+11]=LOBYTE(LOWORD((int)d));
sOut.bytData[n+12]=HIBYTE(LOWORD((int)d));
sOut.bytData[n+13]=LOBYTE(HIWORD((int)d));
sOut.bytData[n+14]=HIBYTE(HIWORD((int)d));
//高度
sOut.bytData[n+15]=0;
sOut.bytData[n+16]=0;
sOut.bytData[n+17]=0;
sOut.bytData[n+18]=0;
//速度
sprintf(Temp, "%02X%02X.%02X", Data[19+m], Data[20+m], Data[22+m]);
d=250*1.852*atof(Temp)/9;
sOut.bytData[n+19]=LOBYTE(LOWORD((int)d));
sOut.bytData[n+20]=HIBYTE(LOWORD((int)d));
sOut.bytData[n+21]=LOBYTE(HIWORD((int)d));
sOut.bytData[n+22]=HIBYTE(HIWORD((int)d));
//方向
sprintf(Temp, "%02X%02X", Data[23+m], Data[24+m]);
d=3141.59266*atof(Temp)/180;
sOut.bytData[n+23]=LOBYTE((WORD)d);
sOut.bytData[n+24]=HIBYTE((WORD)d);
//里程
sOut.bytData[n+25]=Data[m+31]; //里程4B
sOut.bytData[n+26]=Data[m+30];
sOut.bytData[n+27]=Data[m+29];
sOut.bytData[n+28]=Data[m+28];
//车辆状态字
b1=Data[m+32];
b2=Data[m+33];
b3=Data[m+34];
b4=Data[m+35];
}
memset(Alarm, 0, 100);
memset(Status, 0, 100);
if((b3&0X80)>0) strcat(Alarm, "G");//超速报警
if((b1&0X80)>0)
strcat(Status, "L");//点火回传开
else
strcat(Status, "l");//点火回传关
m=(BYTE)strlen(Alarm);
n=29*Data[11]+1;
sOut.bytData[n]=m;
n++;
memmove(sOut.bytData+n, Alarm, m);
n+=m;
m=(BYTE)strlen(Status);
sOut.bytData[n]=m;
n++;
memmove(sOut.bytData+n, Status, m);
n+=m;
break;
case 0X70: //显示屏
sOut.bytType=0X21;
sOut.uType=GCCP_POSITION_INFO;
sOut.wSeq=0;
memset(Info, 0, 200);
sOut.uUser=GetDisData(Data+8, Info, &sOut.bytData[0]);
m=strlen(Info);
sOut.bytData[1]=(BYTE)m;
n=2;
memmove(sOut.bytData+n, Info, m);
n+=m;
m=Data[8]+8;
//定位星数
if(Data[m+3]==0XA1)
sOut.bytData[n]=4;
else
sOut.bytData[n]=2;
n++;
//日期
sprintf(Temp, "%02X", Data[m+27]);
sOut.bytData[n]=(BYTE)atoi(Temp);
n++;
sprintf(Temp, "%02X", Data[m+26]);
sOut.bytData[n]=(BYTE)atoi(Temp);
n++;
sprintf(Temp, "%02X", Data[m+25]);
sOut.bytData[n]=(BYTE)atoi(Temp);
n++;
//时间
sprintf(Temp, "%02X", Data[m]);
sOut.bytData[n+4]=(BYTE)atoi(Temp);
n++;
sprintf(Temp, "%02X", Data[m+1]);
sOut.bytData[n+5]=(BYTE)atoi(Temp);
n++;
sprintf(Temp, "%02X", Data[m+2]);
sOut.bytData[n+6]=(BYTE)atoi(Temp);
n++;
AdjustTime(sOut.bytData+n+1, 8);
//纬度
sprintf(Temp, "%02X%02X.%02X%02X%02X", Data[4+m], Data[5+m], Data[7+m], Data[8+m], Data[9+m]);
memset(Buf, 0, 20);
memmove(Buf, Temp, 2);
d=atof(Buf);
memset(Buf, 0, 20);
memmove(Buf, Temp+2, 8);
d+=atof(Buf)/60;
d=314159266*d/180; //0183格式转换成二进制
if(Data[10+m]==0XA4)
d=-d;
sOut.bytData[n]=LOBYTE(LOWORD((int)d));
n++;
sOut.bytData[n]=HIBYTE(LOWORD((int)d));
n++;
sOut.bytData[n]=LOBYTE(HIWORD((int)d));
n++;
sOut.bytData[n]=HIBYTE(HIWORD((int)d));
n++;
//经度
sprintf(Temp, "%02X%02X%02X.%02X%02X%02X", Data[11+m], Data[12+m], Data[13+m], Data[15+m], Data[16+m], Data[17+m]);
memset(Buf, 0, 20);
memmove(Buf, Temp, 4);
d=atof(Buf);
memset(Buf, 0, 20);
memmove(Buf, Temp+4, 8);
d+=atof(Buf)/60;
d=314159266*d/180; //0183格式转换成二进制
if(Data[18+m]==0XA7)
d=-d;
sOut.bytData[n]=LOBYTE(LOWORD((int)d));
n++;
sOut.bytData[n]=HIBYTE(LOWORD((int)d));
n++;
sOut.bytData[n]=LOBYTE(HIWORD((int)d));
n++;
sOut.bytData[n]=HIBYTE(HIWORD((int)d));
n++;
//高度
sOut.bytData[n]=0;
n++;
sOut.bytData[n]=0;
n++;
sOut.bytData[n]=0;
n++;
sOut.bytData[n]=0;
n++;
//速度
sprintf(Temp, "%02X%02X.%02X", Data[19+m], Data[20+m], Data[22+m]);
d=250*1.852*atof(Temp)/9;
sOut.bytData[n]=LOBYTE(LOWORD((int)d));
n++;
sOut.bytData[n]=HIBYTE(LOWORD((int)d));
n++;
sOut.bytData[n]=LOBYTE(HIWORD((int)d));
n++;
sOut.bytData[n]=HIBYTE(HIWORD((int)d));
n++;
//方向
sprintf(Temp, "%02X%02X", Data[23+m], Data[24+m]);
d=3141.59266*atof(Temp)/180;
sOut.bytData[n]=LOBYTE((WORD)d);
n++;
sOut.bytData[n]=HIBYTE((WORD)d);
n++;
//里程
sOut.bytData[n]=Data[m+31];
n++;
sOut.bytData[n]=Data[m+30];
n++;
sOut.bytData[n]=Data[m+29];
n++;
sOut.bytData[n]=Data[m+28];
n++;
//状态字
b1=Data[m+32];
b2=Data[m+33];
b3=Data[m+34];
b4=Data[m+35];
memset(Alarm, 0, 100);
memset(Status, 0, 100);
if((b3&0X80)>0) strcat(Alarm, "G");//超速报警

if((b1&0X80)>0)
strcat(Status, "L");//点火回传开
else
strcat(Status, "l");//点火回传关

m=(BYTE)strlen(Alarm);
sOut.bytData[n]=m;
n++;
memmove(sOut.bytData+n, Alarm, m);
n+=m;
m=(BYTE)strlen(Status);
sOut.bytData[n]=m;
n++;
memmove(sOut.bytData+n, Status, m);
n+=m;
break;
case 0X50: //手柄
sOut.bytType=0X22;
sOut.uType=GCCP_POSITION_INFO;
sOut.wSeq=0;
memset(Info, 0, 200);
GetHanData(Data+8, Len-9, Info);
m=strlen(Info);
sOut.bytData[0]=0;
sOut.bytData[1]=(BYTE)m;
memmove(sOut.bytData+2, Info, m);
n=m+2;
break;
case 0X40://参数读取指令返回
sOut.wSeq=(WORD)Byte2Uint(0, 0, Data[10], Data[9]);
sOut.bytType=0X11;//上发设置参数
sOut.uType=GCCP_OPRATION_INFO;//设备操作回应信息(修改,设置等操作)
switch(Data[8])
{
case 0X01: //读取车台版本号
break;
case 0X02: //读取E2内的数据
break;
default:
return FALSE;
}
default:
return FALSE;
}
Data[0]=LOBYTE(LOWORD(n));
Data[1]=HIBYTE(LOWORD(n));
Data[2]=LOBYTE(HIWORD(n));
Data[3]=HIBYTE(HIWORD(n));
sOut.uDLen=Byte2Uint(Data[3], Data[2], Data[1], Data[0]);
n+=71;
Data[0]=LOBYTE(LOWORD(n));
Data[1]=HIBYTE(LOWORD(n));
Data[2]=LOBYTE(HIWORD(n));
Data[3]=HIBYTE(HIWORD(n));
sOut.uTLen=Byte2Uint(Data[3], Data[2], Data[1], Data[0]);
memmove(lpOut, &sOut, n);
return TRUE;
}
Cristinays 2011-09-04
  • 打赏
  • 举报
回复
谢谢各位高手的回复,能否请各位高手帮个忙,帮我把下面的代码生成一下,把生成好的dll文件发给我,老板临时分配的又要得急,诚请各位帮忙,我的邮箱是mifengdexin@163.com,在此谢谢了。


#define GCCP_POSITION_INFO 0X10000090 //设备主动回传信息(位置信息)
#define GCCP_OPRATION_INFO 0X11000090 //设备操作回应信息(修改、设置操作)
#define GCCP_CALLING_INFO 0X15000090 //回呼数据
#define GCCP_ALARM_INFO 0X17000090 //设备主动报警信息

#define CMD_INITIAL1 0X010000A0
#define CMD_INITIAL2 0X020000A0
#define CMD_CALLPOS1 0X030000A0
#define CMD_CALLPOS2 0X040000A0
#define CMD_NEWPASS 0X050000A0
#define CMD_CONTROL1 0X060000A0
#define CMD_CONTROL2 0X070000A0
#define CMD_CONTROL3 0X080000A0
#define CMD_CONTROL4 0X090000A0
#define CMD_CONTROL5 0X0A0000A0
#define CMD_CONTROL6 0X0B0000A0
#define CMD_CONTROL7 0X0C0000A0
#define CMD_CONTROL8 0X0D0000A0
#define CMD_CONTROL9 0X0E0000A0
#define CMD_CONTROL10 0X0F0000A0
#define CMD_LCDINFO 0X110000A0
#define CMD_BADINFO 0X120000A0
#define CMD_READSET 0X130000A0
#define CMD_LISTENIN 0X140000A0
#define CMD_SETMODE 0X150000A0
#define CMD_SETRECORD 0X160000A0
#define CMD_SETSPEED 0X170000A0
#define CMD_SETLOAD 0X180000A0
#define CMD_SETBOUND 0X190000A0
#define CMD_SETTIME 0X1A0000A0
#define CMD_SETDRIVER 0X1B0000A0
#define CMD_SETSAVE 0X1C0000A0
#define CMD_SETCODE1 0X1D0000A0
#define CMD_SETCODE2 0X1E0000A0
#define CMD_SETGPSPOS 0X1F0000A0
#define CMD_SETMOBILE 0X210000A0
#define CMD_SETFIRE 0X220000A0
#define CMD_SETCODE 0X230000A0
#define CMD_SETLINK 0X240000A0
#define CMD_SETPICTURE 0X250000A0
#define CMD_SETEMAIL 0X260000A0
#define CMD_SETKEYMODE 0X270000A0
#define CMD_CALLPHOTO1 0X280000A0
#define CMD_CALLPHOTO2 0X290000A0
#define CMD_STOPPOS 0X2A0000A0
#define CMD_STOPPHOTO 0X2B0000A0
#define CMD_SENDSM 0X2C0000A0
#define CMD_RAWMSG 0X2D0000A0
#define CMD_DELIVERY 0X2E0000A0
#define CMD_VERSION 0X3E0000A0
#define CMD_EEPROM 0X3F0000A0
#define CMD_SETWORK 0X400000A0
#define CMD_SETBOUND1 0X410000A0
#define CMD_SETALARM 0X420000A0
#define CMD_SETOUT 0X430000A0
#define CMD_SETFIRE1 0X440000A0
#define CMD_SETRECORD1 0X450000A0
#define CMD_SETSPEED1 0X460000A0
#define CMD_SETLINE 0X470000A0
#define CMD_SETIMPACT 0X480000A0
#define CMD_SETFENCE 0X490000A0
#define CMD_SETALARM1 0X4A0000A0
#define CMD_SETBLIND 0X4B0000A0
#define CMD_SETALARM2 0X4C0000A0
#define CMD_SETVALUE 0X4D0000A0
#define CMD_SETURGE 0X4E0000A0
#define CMD_SETFIRE2 0X4F0000A0
#define CMD_SETMODE1 0X500000A0
#define CMD_SETLISTEN 0X510000A0
#define CMD_SETRECORD2 0X520000A0
#define CMD_SETBOUND2 0X530000A0
#define CMD_SETSTIME 0X550000A0

//下行数据入口数据结构
struct STRUCT_C2D_IN
{
char chDev[21];
char chWord[21];
BYTE bytCh;
char chAddr[30];
WORD wPort;
WORD wSeq;
UINT uCmd;
BYTE bytFmt;
UINT uLen;
BYTE bytData[1024];

STRUCT_C2D_IN()
{
ZeroMemory(this, sizeof(STRUCT_C2D_IN));
}
};
//下行数据出口数据结构
struct STRUCT_C2D_OUT
{
BYTE bytCh;
BYTE bytFmt;
UINT uLen;
BYTE bytData[1024];

STRUCT_C2D_OUT()
{
ZeroMemory(this, sizeof(STRUCT_C2D_OUT));
}
};

//上行数据入口数据结构
struct STRUCT_D2C_IN
{
BYTE bytCh;
BYTE bytFmt;
UINT uLen;
BYTE bytData[1024];

STRUCT_D2C_IN()
{
ZeroMemory(this, sizeof(STRUCT_D2C_IN));
}
};
//上行数据出口数据结构
struct STRUCT_D2C_OUT
{
UINT uTLen;
UINT uType;
WORD wSeq;//命令流水号
BYTE bytCh;//数据通道
char chDev[21];//设备编号
char chWord[21];//操作密码
BYTE bytType;//数据类型
UINT uUser;//用户ID号
UINT uWork;//工单号
UINT uRes;
BYTE bytFmt;
UINT uDLen;//数据长度
BYTE bytData[1024];//数据内容;

STRUCT_D2C_OUT()
{
ZeroMemory(this, sizeof(STRUCT_D2C_OUT));
}
};

extern "C" BOOL C2D(BYTE* lpIn, BYTE* lpOut)
{
STRUCT_C2D_IN sIn=*(STRUCT_C2D_IN*)lpIn;
STRUCT_C2D_OUT sOut;
sIn.uLen=(sIn.uLen&0xFF000000)/0x1000000+(sIn.uLen&0xFF0000)/0x100+
(sIn.uLen&0xFF00)*0x100+(sIn.uLen&0xFF)*0x1000000;
if(sIn.uLen>1024)
return FALSE;

switch(sIn.uCmd)
{
case CMD_INITIAL1://单中心初始化
break;
case CMD_INITIAL2://多中心初始化
break;
case CMD_NEWPASS://修改操作密码
break;
case CMD_CALLPOS1://位置呼叫
break;
case CMD_STOPPOS: //停止呼叫
break;
case CMD_CALLPOS2://位置综合呼叫
break;
case CMD_CONTROL7://终止报警
break;
case CMD_SETOUT: //车载单元控制指令GTCMD
break;
case CMD_LCDINFO://发送显示屏信息
break;
case CMD_BADINFO://发送手柄信息
break;
case CMD_LISTENIN://设置监听电话
break;
case CMD_SETMOBILE: //设置向手机报警
break;
case CMD_SETSPEED: //设置超速报警
break;
case CMD_SETIMPACT: //设置碰状报警
break;
case CMD_SETALARM: //设置输入信号变化报警开关
break;
case CMD_SETRECORD2: //设置信息存贮
break;
case CMD_SETBOUND2: //设置电子围栏
break;
case CMD_SETFIRE: //设置点火回传
break;
case CMD_SETCODE1: //设置限入电话
break;
case CMD_SETCODE2: //设置限出电话
break;
case CMD_SETKEYMODE://设置服务、救援模式
break;
case CMD_SETFIRE1: //设置点火、熄火变化及主电亏电时上发信息功能
break;
case CMD_VERSION: //读取车台版号
break;
case CMD_EEPROM: //读取E2内的数据
if(!GetInfo((char*)sIn.bytData, Temp)) //获取数据类型1-255
strcpy(Temp, (char*)sIn.bytData);
switch(atoi(Temp))
{
case 1:
break;
case 2:
break;
case 3:
break;
case 5:
break;
case 6:
break;
case 7:
break;
case 8:
break;
case 9:
break;
case 10:
break;
case 11:
break;
case 13:
break;
case 14:
break;
case 15:
break;
case 17:
break;
case 18:
break;
case 19:
break;
case 20:
break;
case 21:
break;
case 22:
break;
case 23:
break;
case 24:
break;
case 25:
break;
case 26:
break;
case 27:
break;
case 28:
break;
case 29:
break;
case 30:
break;
case 31:
break;
case 32:
break;
case 33:
break;
case 34:
break;
case 35:
break;
case 36:
break;
case 37:
break;
case 38:
break;
case 39:
break;
case 40:
break;
case 41:
break;
case 42:
break;
case 43:
break;
case 44:
break;
default:
return FALSE;
}
break;
default:
return FALSE;
}
//校验码
sOut.bytData[Len]=CheckSum(sOut.bytData, Len);
Len++;
Buf[0]=LOBYTE(LOWORD(Len));
Buf[1]=HIBYTE(LOWORD(Len));
Buf[2]=LOBYTE(HIWORD(Len));
Buf[3]=HIBYTE(HIWORD(Len));
sOut.uLen=Byte2Uint(Buf[3], Buf[2], Buf[1], Buf[0]);
memmove(lpOut, &sOut, Len+6);
return TRUE;
}
day_learn 2011-09-04
  • 打赏
  • 举报
回复
在windows平台下,数组或纯结构使用ZeroMemory是安全的,而类(class)就使用构造函数进行初始化,不要调用ZeroMemory。  
ZeroMemory是windows中的宏函数,楼主不要在构造函数中调用! 
另外,如果一个类的结构中包含STL模板(Vector、List、Map等等),那么使用ZeroMemory对这个类的对象中进行清零操作也会引起一系列的崩溃问题(指针指向内存错误、迭代器越界访问等)。
zmshy2128 2011-09-03
  • 打赏
  • 举报
回复
ref class 是C++/CLI中的引用类类型,相应的还有个值类型value class。
二者都跟纯C++的类有区别的。

一个函数、一个类(如果类中有嵌套类,也必须一致)要么按照C++/CLI的语义编译,要么按照纯C++的语义编译。
Cristinays 2011-09-03
  • 打赏
  • 举报
回复
我是用vc++建了一个类库,然后vc++自动生成了一个public class ref CreateDriver(生成的头文件Drivers.h),我把ref去掉就好了,请问这是什么问题呢?谢谢了
ljhhh0123 2011-09-03
  • 打赏
  • 举报
回复
很明显,楼主用的是vs托管代码。不是纯c++.
神一样的对友 2011-09-03
  • 打赏
  • 举报
回复
这个在我机子上没有错误。

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧