11

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

编辑:

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

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

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

以下是我尝试过的几件事,我相信其中包括针对这篇文章的下 2 个答案的以下建议。不幸的是,它们不起作用。如果有人能指出我做错了什么并可能解决我的问题,我将不胜感激。

所有这些示例都假定 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...
4

8 回答 8

34

LPCSTR您可以在不进行任何强制转换的情况下将 char 数组隐式转换为:

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

AnLPCSTR是一个 Windows typedef,用于指向常量字符串的长指针。在 Win16 编程的黑暗日子里,有不同类型的指针:指针和指针,有时也分别称为指针和指针。Near 指针只能指向由 x86 段寄存器之一确定的 64KB 内存段。远指针可以指向任何东西。如今在具有虚拟内存的 Win32 中,不需要近指针——所有指针都是长指针。

因此, anLPSTR是 a 的 typedefchar *或指向字符串的指针。AnLPCSTRconst版本,即它是 a 的 typedef const char *。在 C 中,数组衰减为指向其第一个元素的指针,因此 achar[]衰减为 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#definedCreateFileACreateFileW适当的,对于具有 ANSI 和宽字符版本的每个其他函数也是如此。

同样,根据是否启用 Unicode,类型TCHARtypedef编辑为char或,并被编辑为指向 a 的指针。wchar_tLPCTSTRtypedefconst TCHAR

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

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

或者,您可以显式使用所有内容的 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, ...);
于 2009-06-10T16:15:48.073 回答
3

你的 char 数组是什么格式的?

它是一个const char[]还是非常数?

LPCSTR 只是“指向常量字符串的长指针”的(有点)令人困惑的 Microsoft 名称。

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

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

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

于 2009-06-10T16:07:58.743 回答
2

试试这样…………

TCHAR *pcCommPort = TEXT("COM1");
HANDLE h = CreateFile(pcCommPort,other arguments);
于 2011-09-29T19:26:57.370 回答
1

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

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

TCHAR portName[12] = { 0 };

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

CreateFile(portName...
于 2009-06-12T13:26:43.667 回答
1
char* filename;
LPCTSTR ime = CA2W(filename);

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

于 2015-01-22T07:21:02.197 回答
0

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

你根本不需要做任何事情。它会自动转换为该类型(初始化程序和 sizeof 除外)。

“创建文件(端口名...”

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

也许您还应该告诉我们,当 Adam Rosenfield 的 whcar_t 版本不适合您时,VC++ 给了您什么错误信息?

于 2009-06-12T03:41:58.190 回答
0

我不确定你最后是否想通了,但我遇到了同样的问题,以下对我来说效果很好:

int  comPortNum = 5;
char comPortName[32];
sprintf((LPTSTR)comPortName, TEXT("\\\\.\\COM%d"), comPortNum);
HANDLE h = CreateFile(comPortName,other arguments);
于 2013-12-12T22:50:40.247 回答
0

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

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