首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我是否正确地将"const char *“转换为"TCHAR*"?

我是否正确地将"const char *“转换为"TCHAR*"?
EN

Stack Overflow用户
提问于 2018-12-22 04:14:09
回答 4查看 2.9K关注 0票数 0

我试图将一个进程名作为TCHAR传递给下面的void:

代码语言:javascript
运行
复制
void GetBaseAddressByName(DWORD pID, TCHAR *pN)    

如下所示:

代码语言:javascript
运行
复制
GetBaseAddressByName(aProcs[i], (TCHAR*)"Process.exe");

所以我的问题是:我所做的是正确的吗?因为我已经在多位和Unicode上用我的项目的字符集尝试了TEXT("Process.exe")和_T("Process.exe"),它只是告诉我

代码语言:javascript
运行
复制
argument of type "const char*" is incompatible with parameter of type "TCHAR*"
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-12-22 06:11:10

(TCHAR*)"Process.exe"不是有效的类型转换。当项目字符集设置为ANSI/MBCS时,它将“工作”,但如果字符集设置为Unicode,它将产生垃圾。

使用TEXT("Process.exe")是使字符串文字使用TCHAR字符的正确方法。

代码语言:javascript
运行
复制
GetBaseAddressByName(aProcs[i], TEXT("Process.exe"));

但是,您需要将pN参数更改为const TCHAR * (或LPCTSTR):

代码语言:javascript
运行
复制
void GetBaseAddressByName(DWORD pID, const TCHAR *pN);

代码语言:javascript
运行
复制
void GetBaseAddressByName(DWORD pID, LPCTSTR pN);

字符串文字是常量数据,您不能传递指向常量数据的指针(如果不使用const_cast强制转换const ),则不能传递指向非常量数据的指针。这就是为什么在尝试使用TEXT()/_T()宏时仍然收到错误的原因。

票数 0
EN

Stack Overflow用户

发布于 2018-12-22 05:39:06

简而言之,答案是否定的。TCHAR根据项目的Unicode/多字节设置映射到charwchar_t。因此,通常情况下,这样的强制转换要么是不必要的,要么是不正确的。正如您所说,正确的方法是使用TEXT_T宏。出现错误的原因是您试图将一个const字符串传递给一个需要可变字符串的函数。避免此错误的安全方法是将常量字符串复制到本地TCHAR缓冲区中,然后将其传递给GetBaseAddressByName

票数 3
EN

Stack Overflow用户

发布于 2018-12-22 04:23:29

最好先有一个TCHAR数组,然后再复制到其中。

代码语言:javascript
运行
复制
#include "atlstr.h"
char const *  procName = "processName.exe";
TCHAR szName [128];
_tcscpy(szName, A2T(procName));
GetBaseAddressByName(aProcs[i], szName);

正如@Remy Lebeau在评论中所建议的那样,可以将procName定义为TCHAR const * procName = TEXT("processName.exe");

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53890359

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档