char数组到c中的LPCTSTR转换

时间:2009-06-10 16:03:44

标签: c windows arrays char

有没有人知道如何将char数组转换为c?

中的LPCTSTR

编辑:

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

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

CreateFile(_T("\\\\.\\COM11")... //hardcoded for com port 11

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

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

1

char portName[12] = { 0 };

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

CreateFile(portName...

我还尝试过使用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...

3

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

LPCSTR lpPortName = portName;

CreateFile(lpPortName...

8 个答案:

答案 0 :(得分:34)

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

void SomeFunction(LPCSTR aString);
...
char myArray[] = "hello, world!";
SomeFunction(myArray);

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

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


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

对于几乎每个Win32函数都采用某种字符串类型的参数(可能是间接的,即作为参数传递的结构的成员),实际上有两个版本的函数:一个采用8位ANSI字符串,以及一个16位宽字符串的字符串。要获取实际的函数名称,请在函数名称后附加AW。因此,CreateFile()的ANSI版本名为CreateFileA(),宽字符版本名为CreateFileW()。根据您是否使用Unicode进行编译(即是否定义了预处理器符号_UNICODE),符号CreateFile#define d为CreateFileA或{ {1}}视情况而定,同样适用于具有ANSI和宽字符版本的每个其他函数。

同样,CreateFileW类型TCHARtypedefchar,具体取决于是否启用了Unicode,wchar_tLPCTSTR转到指向typedef的指针。

因此,为了使您的代码更正,您应该使用const TCHAR字符串替换您正在使用的字符串,并使用类型通用版本的TCHARsprintf_s

_stprintf_s

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

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

答案 1 :(得分:3)

你的char数组采用什么格式?

const char[]还是非const?

LPCSTR只是(有些)令人困惑的微软名称“长指针到常量字符串”。

LPCSTR bar = "hello";
const char *foo = bar;

const char *evil = "hello";
LPCSTR sauron = evil;

如果需要获取非const版本,则要么丢弃constness,要么复制到新数组。我可能更喜欢后者。变量通常是const的原因,改变它们几乎总是不好的做法。

答案 2 :(得分:2)

尝试这样.........

TCHAR *pcCommPort = TEXT("COM1");
HANDLE h = CreateFile(pcCommPort,other arguments);

答案 3 :(得分:1)

你有TCHAR的字符串函数。例如,您可以使用stprintf_s接受TCHAR。这样,您就可以使代码与unicode或多字节字符集“独立”。

您的代码(变体1)变为:

TCHAR portName[12] = { 0 };

stprintf_s( portName, sizeof( portName ) / sizeof(TCHAR), _T("\\\\.\\COM%i"), portNum );

CreateFile(portName...

答案 4 :(得分:0)

“有人知道如何在c中将char数组转换为LPCSTR吗?”

您根本不需要做任何事情。它会自动转换为该类型(初始值设定项和sizeof除外)。

“的CreateFile(PORTNAME ...”

也许你应该告诉我们VC ++在编译时给你的错误信息?

也许你还应该告诉我们当亚当罗森菲尔德的whcar_t版本不适合你的时候VC ++给你的错误信息是什么?

答案 5 :(得分:0)

我不确定你最后是否想出了什么,但是我遇到了同样的问题并且效果很好:

int  comPortNum = 5;
char comPortName[32];
sprintf((LPTSTR)comPortName, TEXT("\\\\.\\COM%d"), comPortNum);
HANDLE h = CreateFile(comPortName,other arguments);

答案 6 :(得分:0)

char* filename;
LPCTSTR ime = CA2W(filename);

这是字符串转换宏,适用于我的VS12

答案 7 :(得分:0)

这是一个古老的经典问题。我在UNICODE中使用它。

char *pChar = "My Caption of My application";
    WCHAR wsz[512];
    swprintf(wsz, L"%S", pChar);
    SetWindowText(hWnd,         // ウィンドウまたはコントロールのハンドル
        wsz   // タイトルまたはテキスト
    );