有谁知道如何将c数组转换为c中的LPCTSTR?
编辑:
为了更多参考,我需要在字符串中添加一个整数,然后将该字符串转换为LPCTSTR,以获取windows函数CreateFile()的第一个参数.
这是我目前正在使用的硬编码示例,但我需要能够传入任何数字以用作端口号.
CreateFile(_T("\\\\.\\COM11")... //hardcoded for com port 11
Run Code Online (Sandbox Code Playgroud)
以下是我尝试过的几件事,我相信这篇文章的下两个答案包括以下建议.不幸的是,他们没有工作.如果有人能指出我做错了什么并且可能解决我的问题,我会很感激.
所有这些示例都假设portNum是一个已经分配了有效值的int
char portName[12] = { 0 };
sprintf_s( portName, sizeof( portName ), "\\\\.\\COM%i", portNum );
CreateFile(portName...
Run Code Online (Sandbox Code Playgroud)
我也尝试过使用LPCSTR的#1值得它的价值......
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)
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 LPCSTR
是const
版本,即它是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位宽字符串的.要获取实际的函数名称,请在函数名称后附加A
或W
.因此,ANSI版本CreateFile()
被命名CreateFileA()
,并且宽字符版本被命名CreateFileW()
.根据您是否正在使用Unicode编译启用(即预处理器符号是否_UNICODE
被定义),符号CreateFile
是#define
d要么CreateFileA
或CreateFileW
适当的,同样对于具有ANSI和宽字符版本所有其他功能.
沿着相同的行,类型TCHAR
被typedef
编辑为char
或者wchar_t
,取决于是否启用了Unicode,并且LPCTSTR
被typedef
编辑为指向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)