char数组到c中的LPCTSTR转换

11 c windows arrays char

有谁知道如何将c数组转换为c中的LPCTSTR?

编辑:

为了更多参考,我需要在字符串中添加一个整数,然后将该字符串转换为LPCTSTR,以获取windows函数CreateFile()的第一个参数.

这是我目前正在使用的硬编码示例,但我需要能够传入任何数字以用作端口号.

CreateFile(_T("\\\\.\\COM11")... //hardcoded for com port 11
Run Code Online (Sandbox Code Playgroud)

以下是我尝试过的几件事,我相信这篇文章的下两个答案包括以下建议.不幸的是,他们没有工作.如果有人能指出我做错了什么并且可能解决我的问题,我会很感激.

所有这些示例都假设portNum是一个已经分配了有效值的int

1

char portName[12] = { 0 };

sprintf_s( portName, sizeof( portName ), "\\\\.\\COM%i", portNum );

CreateFile(portName...
Run Code Online (Sandbox Code Playgroud)

我也尝试过使用LPCSTR的#1值得它的价值......

2

LPCSTR SomeFunction(LPCSTR aString) {
    return aString;
}

main() {

char portName[12] = { 0 };
sprintf_s( portName, sizeof( portName ), "\\\\.\\COM%i", portNum );

LPCSTR lpPortName = SomeFunction(portName);

CreateFile(lpPortName...
Run Code Online (Sandbox Code Playgroud)

3

const char * portName = "";
sprintf_s( portName, sizeof( portName ), "\\\\.\\COM%i", portNum );

LPCSTR lpPortName = portName;

CreateFile(lpPortName...
Run Code Online (Sandbox Code Playgroud)

Ada*_*eld 34

您可以隐式地将char数组转换为LPCSTR不带任何强制转换的数组:

void SomeFunction(LPCSTR aString);
...
char myArray[] = "hello, world!";
SomeFunction(myArray);
Run Code Online (Sandbox Code Playgroud)

An LPCSTR是指向常量字符串的长指针的Windows typedef.回到Win16编程的黑暗时代,有不同类型的指针:指针和指针,有时也分别称为指针和指针.近指针只能指向由x86段寄存器之一确定的64KB内存段.远指针可以指向任何东西.现在在带有虚拟内存的Win32中,不需要近指针 - 所有指针都很长.

因此,a LPSTR是a的typedef char *,或指向字符串的指针.An LPCSTRconst版本,即它是a的typedef const char *.在C中,数组衰减为指向其第一个元素的指针,因此char[]衰变为a char*.最后,任何类型的"指向T的指针"(对于任何类型T)都可以隐式转换为"指向const T的指针".因此,结合这三个事实,我们看到我们可以隐含地将a转换char[]为a LPCSTR.


为了回应你的编辑,我猜你正在编译一个Unicode应用程序.如果你仔细查看文档CreateFile(),你会发现filename参数实际上是一个LPCTSTR,而不是一个LPCSTR(注意T).

对于几乎每个Win32函数都采用某种字符串类型的参数(可能是间接的,即作为参数传递的结构的成员),实际上有两个版本的函数:一个采用8位ANSI字符串,以及一个采用16位宽字符串的.要获取实际的函数名称,请在函数名称后附加AW.因此,ANSI版本CreateFile()被命名CreateFileA(),并且宽字符版本被命名CreateFileW().根据您是否正在使用Unicode编译启用(即预处理器符号是否_UNICODE被定义),符号CreateFile#defined要么CreateFileACreateFileW适当的,同样对于具有ANSI和宽字符版本所有其他功能.

沿着相同的行,类型TCHARtypedef编辑为char或者wchar_t,取决于是否启用了Unicode,并且LPCTSTRtypedef编辑为指向a的指针const TCHAR.

因此,为了使你的代码是正确的,你应该更换你使用字符串TCHAR字符串,并使用的类型,通用版本sprintf_s,_stprintf_s:

TCHAR portName[32];
_stprintf_s(portName, sizeof(portName)/sizeof(TCHAR), _T("\\\\.\\COM%d"), portNum);
CreateFile(portName, ...);
Run Code Online (Sandbox Code Playgroud)

或者,您可以显式使用所有内容的ANSI或宽字符版本:

// Use ANSI
char portName[32];
sprintf_s(portName, sizeof(portName), "\\\\.\\COM%d", portNum);
CreateFileA(portName, ...);

// Use wide-characters
wchar_t portName[32];
swprintf_s(portName, sizeof(portName)/sizeof(wchar_t), L"\\\\.\\COM%d", portNum);
CreateFileW(portName, ...);
Run Code Online (Sandbox Code Playgroud)