不能将参数 从“CString”转换为“const wchar_t *”

chipo_fly 2012-07-27 03:55:19
有一个打开文件的操作:


CFileDialog opendlg(false,NULL,L"Video_00.avi",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,L"Video Files (*.avi)|*.avi|All Files (*.*)|*.*||",NULL);
if (opendlg.DoModal() == IDOK)
{
strFileName = opendlg.GetPathName();
}
const size_t strsize=(strFileName.GetLength()+1)*2; // 宽字符的长度;
char* pstr= new char[strsize]; //分配空间;
size_t sz=0;
wcstombs_s(&sz,pstr,strsize,strFileName,_TRUNCATE);
int n=atoi((const char*)pstr);



这段代码以前使用过,现在又需要用到,直接copy过来用,结果却出现了以下错误:

CFileDialog::CFileDialog(BOOL,LPCTSTR,LPCTSTR,DWORD,LPCTSTR,CWnd *,DWORD,BOOL)”: 不能将参数 3 从“const wchar_t [13]”转换为“LPCTSTR”
1> 与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换

wcstombs_s”: 不能将参数 4 从“CString”转换为“const wchar_t *”
1> 没有可用于执行该转换的用户定义的转换运算符,或者无法调用该运算符





对于这些格式的转化最头疼了。。。。。关键是 ,为什么 之前可以用,现在却不可以了呢?
...全文
1972 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
wyl43381998 2014-05-16
  • 打赏
  • 举报
回复
我出现了同样的问题 目前工程用的是UNICODE字符集, 即便我使用_T(XXX) 有没有能解决掉,为什么他们定义了那么是死的东西,格式化这么头疼的问题要程序员来做,大家不能都兼容一下么 哎。不包容,没创新
rufas哥哥 2012-10-09
  • 打赏
  • 举报
回复
因为以前是用unicode字符集,字符串都加了个L就能看出来。

而现在成了多字节字符集。

多字节下用L"Video_00.avi"肯定出错了。改成TEXT宏 TEXT("Video_00.avi")多好
Afterwards_ 2012-09-30
  • 打赏
  • 举报
回复
如果你的项目是UNICODE
CString str;
str.GetBuffer();返回 wchar_t*;
str.GetString();返回 const wchar_t *;
所以如果你这种问题 直接用 getstring 就可以了
Eleven 2012-08-01
  • 打赏
  • 举报
回复
CString -> wchar_t*

USES_CONVERSION;

T2W()
Afterwards_ 2012-08-01
  • 打赏
  • 举报
回复
char* CStringToCharArray(CString str)
{
char *ptr;
#ifdef _UNICODE
LONG len;
len = WideCharToMultiByte(CP_ACP, 0, str, -1, NULL, 0, NULL, NULL);
ptr = new char [len+1];
memset(ptr,0,len + 1);
WideCharToMultiByte(CP_ACP, 0, str, -1, ptr, len + 1, NULL, NULL);
#else
ptr = new char [str.GetAllocLength()+1];
sprintf(ptr,_T("%s"),str);
#endif
return ptr;
}
Motolola 2012-07-31
  • 打赏
  • 举报
回复


CFileDialog opendlg(false,NULL,_T("Video_00.avi"),OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,_T("Video Files (*.avi)|*.avi|All Files (*.*)|*.*||"),NULL);
if (opendlg.DoModal() == IDOK)
{
strFileName = opendlg.GetPathName();
}
const size_t strsize=(strFileName.GetLength()+1)*2; // 宽字符的长度;
char* pstr= new char[strsize]; //分配空间;
size_t sz=0;
wcstombs_s(&sz,pstr,strsize,strFileName,_TRUNCATE);
int n=atoi((const char*)pstr);
牛虻&专家 2012-07-31
  • 打赏
  • 举报
回复
你要增加宏定义UNICODE,_UNICODE
zgl7903 2012-07-31
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]
引用 5 楼 的回复:

LPCTSTR 换成 LPTSTR



额 不行~~~

奇怪的是,之前用这段代码的时候,都是可以的啊~~~
[/Quote]
工程属性中改成 UNICODE 就不会有问题
chipo_fly 2012-07-31
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

LPCTSTR 换成 LPTSTR
[/Quote]


额 不行~~~

奇怪的是,之前用这段代码的时候,都是可以的啊~~~
loving_hoping 2012-07-30
  • 打赏
  • 举报
回复
首先,你要增加宏定义UNICODE,_UNICODE
这样,你的工程就是宽字符工程了,
然后,修改函数入口为基于WinMain的wWinMainCRTStartup,或基于main的wmainCRTStartup
保存,重新生成
she8275081 2012-07-30
  • 打赏
  • 举报
回复
上周五我也遇到了这样的问题。估计是VC装的时候没装好。

Biuld -> comfigurations 选择unicode版本, 就应该OK了。。如果没有的话就要自己添加了。
aiyulunhui 2012-07-29
  • 打赏
  • 举报
回复
L(strFileName)
aiyulunhui 2012-07-29
  • 打赏
  • 举报
回复
lpcwstr
smilenot 2012-07-28
  • 打赏
  • 举报
回复
1.你的工程建立有问题
2.Unicode问题
3.总之都是小问题,你好好摸索下
tuzijia 2012-07-27
  • 打赏
  • 举报
回复
强制类型转换呢 先将string转换称const char* 然后再转
伏神 2012-07-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
LPCTSTR 换成 LPTSTR
[/Quote]

看错了 应该是没有使用unicode字符集编译
zgl7903 2012-07-27
  • 打赏
  • 举报
回复
L"XXXX" 改为 _T("XXXX") 可兼容UNICODE和ANSI
伏神 2012-07-27
  • 打赏
  • 举报
回复
LPCTSTR 换成 LPTSTR
飞翔的薄荷 2012-07-27
  • 打赏
  • 举报
回复
要么是你的编译器有问题,要么是工程属性被该错为了。
你看下WinMain 函数是否被实现了。
chipo_fly 2012-07-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

工程/解决方案未定义UNICODE宏,LPCTSTR被define为const char *
[/Quote]


修改后,出现的错误是:

1>msvcrtd.lib(crtexew.obj) : error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用

我按照 http://apps.hi.baidu.com/share/detail/32165937 看了一下,也没发现错误啊。。。。肿么回事呢。。。
加载更多回复(2)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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