不能将参数 2 从“char [260]”转换为“LPWSTR” 在线等
        老哥们,麻烦帮忙改改,小弟实在是搞不懂这些东西。下面贴出代码

            //#include <cstringt.h>
              #include "../NetWork/stdafx.h"
              #include "hsDataThreadFun.h"
              #include "hsData.h"
              #include <queue>

#include "../NetWork/NetWork_Include/MetroException.h"

#pragma comment(lib, "..\Lib\ShutDown.lib")
extern "C" __declspec(dllexport) void __stdcall ShutdownWindows();

extern HWND g_hMain;

//DataThreadFun DataTemp; //这个对象是为了解决 结构不匹配问题

DataThreadFun::DataThreadFun(){
m_NetWork.Init();

 char lpFile[MAX_PATH] = {0}; //初始化界面文件的路径

////////////前三个错误地点
GetPathExe(lpFile,_T("MAX_PATH")); ///////////////////
strcat(lpFile,_T("\Config\Init.ini"));
CIniFile Init(lpFile);

 if(!Init.IsExistFile()){
     CString str;
     str.Format(_T("初始化配置文件:%s 不存在"), lpFile);
     //throw CNetworkException(str);
     MessageBox(NULL,str,_T("读文件"),NULL);
 }
 //读取文件内容
 m_CarID = Init.ReadString(_T("Init"),_T("CarID"),0);
 m_NowSpeed = Init.ReadString(_T("Init"),_T("当前车速"),0);
 m_MaxSpeed = Init.ReadString(_T("Init"),_T("最大车速"),0);
 m_OperSty = Init.ReadString(_T("Init"),_T("运营类型"),0);
 m_DriverID = Init.ReadString(_T("Init"),_T("司机ID"),0);
 m_TheLine= Init.ReadString(_T("Init"),_T("线路"),0);
 m_DriverIDLastTime = Init.ReadString(_T("Init"),_T("上一次工号"),0);
 m_Picture = Init.ReadString(_T("Init"),_T("预览画面"),0);

 m_hThread = nullptr;
 m_SverStaBol = FALSE;
 m_bInit      = TRUE;
 m_PoweOff    = FALSE;
memset(&m_StaDoor,0,sizeof(m_StaDoor));
m_bRun = TRUE;

}
DataThreadFun::~DataThreadFun(){
//把数据写回配置文件
char lpFile[MAX_PATH] = {0}; //初始化界面文件的路径

 ////////////48,49,50行错误
 GetPathExe(lpFile,MAX_PATH);
 strcat(lpFile,_T("\\Config\\Init.ini")); 
 CIniFile Init(lpFile);

 if(!Init.IsExistFile()){
     CString str;
     str.Format(_T("初始化配置文件:%s 不存在"), lpFile);
     //throw CNetworkException(str);
     MessageBox(NULL,str,_T("读文件"),NULL);
 }

 Init.WriteString(_T("Init"),_T("CarID"),m_CarID);
 Init.WriteString(_T("Init"),_T("当前车速"),m_NowSpeed);
 Init.WriteString(_T("Init"),_T("最大车速"),m_MaxSpeed);
 Init.WriteString(_T("Init"),_T("运营类型"),m_OperSty);
 Init.WriteString(_T("Init"),_T("司机ID"),m_DriverID);
 Init.WriteString(_T("Init"),_T("线路"),m_TheLine);
 Init.WriteString(_T("Init"),_T("上一次工号"),m_DriverIDLastTime);
 Init.WriteString(_T("Init"),_T("预览画面"),m_Picture);

 m_bRun = FALSE;

}

UINT NUMBERMSG = 0;
//把接收到的短息写到硬盘上去,门状态拿来就用
DWORD DataThreadFun::RecveData(LPVOID lParam){ //每隔一段时间就会被调用一次(接收主机发送过来的包,主机发什么不用管,接着就好,其实主机发送的就是我们请求的
//我们的请求在框架中请求),如果 在这段时间里 有还几条发送过来?就会堵到队列中?
DataThreadFun* pData = (DataThreadFun*)lParam;
char lpFile[MAX_PATH]={0};

///////////////78行错误
GetPathExe(lpFile,MAX_PATH);  


CNetPacket packe;
int dID=pData->m_NetWork.GetTerminalID(_T("SERVER"));

pData->m_SverStaBol = pData->m_NetWork.IsOnline(dID);
while (pData->m_bRun)
{
    Sleep(50);
    if (pData->m_NetWork.Receive(dID,packe))
    {
        if(packe.GetParam() == REC_SorMSG){
            Sleep(1000);

            memcpy(&pData->m_StShortMsg,packe.GetBuffer(),sizeof(pData->m_StShortMsg));
            char MsgBuff[200] = {0};
            CString MsgName,MsgStr;

            char lpFile[MAX_PATH]={0}; 

            /////////////98  100行错误
            GetPathExe(lpFile,MAX_PATH);  

            strcat(lpFile,_T("\\Config\\MSG\\"));
            //将读标志 放在文件里
            //以时间作为文件名
            CTime    SysTime = CTime::GetCurrentTime();
            CString CtimeStr,SysTimeStr=SysTime.Format(_T("%Y%m%d"));
            int HTemp  = SysTime.GetHour();
            int MmTemp = SysTime.GetMinute();
            int SeTemp = SysTime.GetSecond();

            CtimeStr = SysTime.Format(_T("%Y年%m月%d日  %H:%M:%S"));

                    /////////////////110行错误
                    MsgName.Format("%s%s%d%d%d.ini",lpFile,SysTimeStr,HTemp,MmTemp,SeTemp);

            try
            {
                CFile file(MsgName, CFile::modeCreate | CFile::modeWrite);   //modeReadWrite 2117

                ///////////////115行错误
            MsgStr.Format("[MSG]\r\nfalg=%d\r\nAttribute=%d\r\nmsg=%s\r\nTime=%s",pData->m_StShortMsg.SoMsFlag,pData->m_StShortMsg.Attribute,pData->m_StShortMsg.MSG,CtimeStr);

                file.Write(MsgStr,MsgStr.GetLength());
                file.Close();
            }
            catch (CMemoryException* e)
            {

            }
            catch (CFileException* e)
            {
            //  e-> ReportError();
            }
            catch (CException* e)
            {
            }
        }else if(REC_LINE == packe.GetParam()){
            //接收站信息,主机会发送一个文件包(要不要检测本地有没有站信息,有就不要下载了,如果线路更新怎么办?)
            //strcat(lpFile,_T("\\Config\\"));
        }else if(REC_STADOOR == packe.GetParam()){
            memcpy(pData->m_StaDoor,packe.GetBuffer(),sizeof(pData->m_StaDoor));
        }else if(REC_MaxSpeed == packe.GetParam()){
            double* dLimiteSpeed = (double*)packe.GetBuffer();
            pData->m_MaxSpeed.Format(_T("%.1f"), *dLimiteSpeed);
        }else if(REC_NowSpeed == packe.GetParam()){
            double* pSpeed = (double*)packe.GetBuffer();
            pData->m_NowSpeed.Format(_T("%.1f"), *pSpeed);
        }else if(REC_StalCar == packe.GetParam()){  
            struct sta{
                BYTE temper[10];
                BYTE guest[10];
                BYTE oil[10];
                BYTE Meliage[20];
            }stat;
            memcpy(&stat,packe.GetBuffer(),sizeof(stat));
            pData->m_temperatureDoor    = stat.temper;
            pData->m_guestNumber        = stat.guest;
            pData->m_oil                = stat.oil;
            pData->m_Meliage            = stat.Meliage;

        }else if(REC_Stalcamera == packe.GetParam()){
            memcpy(&pData->m_CameraState,packe.GetBuffer(),sizeof(pData->m_CameraState));
        }else if(REC_BlackScreen == packe.GetParam()){
            memcpy(&pData->m_bInit,packe.GetBuffer(),sizeof(pData->m_bInit));
        }else if(REC_PowerOff == packe.GetParam()){
            memcpy(&pData->m_PoweOff,packe.GetBuffer(),sizeof(pData->m_PoweOff));
            if(pData->m_PoweOff){
                //执行关机
                ShutdownWindows();
            }else
                return 0;
        }
        ::PostMessage(g_hMain, MSG_DATA, packe.GetParam(), NULL);
    }
}
return 0;

}

bool DataThreadFun::WorkThread_Start()
{
m_hThread = ::CreateThread(NULL, 0, RecveData, this, NULL, NULL);
if (m_hThread == NULL)
{
return false;
}
return true;
}

麻烦各位老哥帮个忙,错误的地方我已经标出来了,应该就是转换的问题,拜托了

2个回答

应该是用了宽字符造成的,可以在工程内设置为使用多字节字符集:
图片说明

weixin_42163711
神农藏百草 回复phenix2009: 好的,谢谢
大约一年之前 回复
phenix2009
白色一大坨 回复weixin_42163711: #define GetPathExe(path,size) memset(path,0,sizeof(size)); 解决
大约一年之前 回复
weixin_42163711
神农藏百草 回复phenix2009: ::GetModuleFileName(NULL,path,MAX_PATH); \PathRemoveFileSpec(path);这个也是那个下面的,不知道为什么复制上去没有
大约一年之前 回复
weixin_42163711
神农藏百草 回复phenix2009: 对,那个就是19行,然后GetPathExe在另一个头文件中是这样定义的。#define GetPathExe(path,size) memset(path,0,size); \
大约一年之前 回复
phenix2009
白色一大坨 回复weixin_42163711: GetPathExe(lpFile,_T("MAX_PATH")); ///////////////////这个是不是19行,这函数你自己定义的吧,去函数里面看看
大约一年之前 回复
phenix2009
白色一大坨 回复weixin_42163711: 没有memset不可能报那个错,建议你看看程序里面是不是哪里用了你没找到
大约一年之前 回复
phenix2009
白色一大坨 回复weixin_42163711: 42行的代码肯定没问题,至于19行,你查一下吧,我也不知你19行写的啥,没法看啊
大约一年之前 回复
weixin_42163711
神农藏百草 回复phenix2009: 嗯,定义成TCHAR了,但是19行还有一个错误, “memset”: 不能将参数 3 从“const wchar_t [9]”转换为“size_t”,但是19行没有用memset,这个cpp中只有42行用了memset,但是没有与报错内容相关的东西。memset(&m_StaDoor,0,sizeof(m_StaDoor));,老哥知道这个是什么原因吗
大约一年之前 回复
phenix2009
白色一大坨 回复weixin_42163711: 那你所有字符串都定义成宽字符,带上_T或者L就行,不过就是花点时间
大约一年之前 回复
weixin_42163711
神农藏百草 这个方法我知道,我想问的是有没有不用改字符集的方法转换
大约一年之前 回复

这是报错内容,麻烦各位老哥帮帮忙

c:\users\administrator\desktop\zhuhaihisenseproject\hisenseprojecttwo\hisenseprojecttwo\hsdatathreadfun.cpp(19): error C2664: “memset”: 不能将参数 3 从“const wchar_t [9]”转换为“size_t”
1> 没有使该转换得以执行的上下文
1>c:\users\administrator\desktop\zhuhaihisenseproject\hisenseprojecttwo\hisenseprojecttwo\hsdatathreadfun.cpp(19): error C2664: “GetModuleFileNameW”: 不能将参数 2 从“char [260]”转换为“LPWSTR”
1> 与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换
1>c:\users\administrator\desktop\zhuhaihisenseproject\hisenseprojecttwo\hisenseprojecttwo\hsdatathreadfun.cpp(19): error C2664: “PathRemoveFileSpecW”: 不能将参数 1 从“char [260]”转换为“LPWSTR”
1> 与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换
1>c:\users\administrator\desktop\zhuhaihisenseproject\hisenseprojecttwo\hisenseprojecttwo\hsdatathreadfun.cpp(20): error C2664: “strcat”: 不能将参数 2 从“const wchar_t [17]”转换为“const char *”
1> 与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换
1>c:\users\administrator\desktop\zhuhaihisenseproject\hisenseprojecttwo\hisenseprojecttwo\hsdatathreadfun.cpp(21): error C2664: “CIniFile::CIniFile(CString)”: 不能将参数 1 从“char [260]”转换为“CString”
1> class“ATL::CStringT
”的构造函数声明为“explicit”
1> with
1> [
1> BaseType=wchar_t,
1> StringTraits=StrTraitMFC_DLL
1> ]
1>c:\users\administrator\desktop\zhuhaihisenseproject\hisenseprojecttwo\hisenseprojecttwo\hsdatathreadfun.cpp(48): error C2664: “GetModuleFileNameW”: 不能将参数 2 从“char [260]”转换为“LPWSTR”
1> 与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换
1>c:\users\administrator\desktop\zhuhaihisenseproject\hisenseprojecttwo\hisenseprojecttwo\hsdatathreadfun.cpp(48): error C2664: “PathRemoveFileSpecW”: 不能将参数 1 从“char [260]”转换为“LPWSTR”
1> 与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换
1>c:\users\administrator\desktop\zhuhaihisenseproject\hisenseprojecttwo\hisenseprojecttwo\hsdatathreadfun.cpp(49): error C2664: “strcat”: 不能将参数 2 从“const wchar_t [17]”转换为“const char *”
1> 与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换
1>c:\users\administrator\desktop\zhuhaihisenseproject\hisenseprojecttwo\hisenseprojecttwo\hsdatathreadfun.cpp(50): error C2664: “CIniFile::CIniFile(CString)”: 不能将参数 1 从“char [260]”转换为“CString”
1> class“ATL::CStringT
”的构造函数声明为“explicit”
1> with
1> [
1> BaseType=wchar_t,
1> StringTraits=StrTraitMFC_DLL
1> ]
1>c:\users\administrator\desktop\zhuhaihisenseproject\hisenseprojecttwo\hisenseprojecttwo\hsdatathreadfun.cpp(78): error C2664: “memset”: 不能将参数 3 从“const wchar_t [9]”转换为“size_t”
1> 没有使该转换得以执行的上下文
1>c:\users\administrator\desktop\zhuhaihisenseproject\hisenseprojecttwo\hisenseprojecttwo\hsdatathreadfun.cpp(78): error C2664: “GetModuleFileNameW”: 不能将参数 2 从“char [260]”转换为“LPWSTR”
1> 与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换
1>c:\users\administrator\desktop\zhuhaihisenseproject\hisenseprojecttwo\hisenseprojecttwo\hsdatathreadfun.cpp(78): error C2664: “PathRemoveFileSpecW”: 不能将参数 1 从“char [260]”转换为“LPWSTR”
1> 与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换
1>c:\users\administrator\desktop\zhuhaihisenseproject\hisenseprojecttwo\hisenseprojecttwo\hsdatathreadfun.cpp(98): error C2664: “GetModuleFileNameW”: 不能将参数 2 从“char [260]”转换为“LPWSTR”
1> 与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换
1>c:\users\administrator\desktop\zhuhaihisenseproject\hisenseprojecttwo\hisenseprojecttwo\hsdatathreadfun.cpp(98): error C2664: “PathRemoveFileSpecW”: 不能将参数 1 从“char [260]”转换为“LPWSTR”
1> 与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换
1>c:\users\administrator\desktop\zhuhaihisenseproject\hisenseprojecttwo\hisenseprojecttwo\hsdatathreadfun.cpp(100): error C2664: “strcat”: 不能将参数 2 从“const wchar_t [13]”转换为“const char *”
1> 与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换
1>c:\users\administrator\desktop\zhuhaihisenseproject\hisenseprojecttwo\hisenseprojecttwo\hsdatathreadfun.cpp(110): error C2664: “void ATL::CStringT
::Format(const wchar_t *,...)”: 不能将参数 1 从“const char [15]”转换为“const wchar_t *”
1> with
1> [
1> BaseType=wchar_t,
1> StringTraits=StrTraitMFC_DLL
1> ]
1> 与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换
1>c:\users\administrator\desktop\zhuhaihisenseproject\hisenseprojecttwo\hisenseprojecttwo\hsdatathreadfun.cpp(115): error C2664: “void ATL::CStringT
::Format(const wchar_t *,...)”: 不能将参数 1 从“const char [46]”转换为“const wchar_t *”
1> with
1> [
1> BaseType=wchar_t,
1> StringTraits=StrTraitMFC_DLL
1> ]
1> 与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换
1>
1>生成失败。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!