无法将命名管道名称分配给 LPTSTR 变量

Can't assign named pipe name to LPTSTR variable

我正在习惯 win32 API 恶作剧,但它很烦人,我这次遇到的问题是关于命名管道名称的分配,这就是我正在做的:

LPTSTR lpszPipename = TEXT("\\.\pipe\mynamedpipe"); 

这是 verbatim from MSDN webpages,令人惊讶的是,这不会编译并发出以下错误:

E0144 a value of type "const wchar_t *" cannot be used to initialize an entity of type "LPTSTR"

现在转换将解决作业,但随后出现 109 错误,您猜对了,ERROR_BROKEN_PIPE

我该如何解决?

LPTSTR 是非常量版本。您正在尝试获取指向字符串文字的非常量指针。

这曾经是有效的 C++(它仍然是有效的 C,因此是示例),但它非常危险,因此他们在 C++11 中将其定为非法。你要么想要:

wchar_t const* lpszPipename = L"\\.\pipe\mynamedpipe"; 

wchar_t pipename[] = L"\\.\pipe\mynamedpipe"; 

问题在于,尽管有相反的说法,但 WinAPI 文档中给出的示例(大部分)是用 C 而不是 C++ 编写的。此外,在 C++ 中不再允许使用字符串文字来初始化非 const 字符指针(自 C++11 起)。

所以,替换:

LPTSTR lpszPipename = TEXT("\\.\pipe\mynamedpipe");

与:

TCHAR lpszPipename[] = TEXT("\\.\pipe\mynamedpipe");

(不过,这是否会修复您的 ERROR_BROKEN_PIPE 是另一回事!)

CreateNamedPipe 将指向 constant 字符串(LPCSTR 或 LPCWSTR)的指针放在管道名称中。所以直接做

CreateNamedPipe(TEXT("\\.\pipe\mynamedpipe"), ..)

我不认为

有任何理由
LPCTSTR lpszPipename = TEXT("\\.\pipe\mynamedpipe");
CreateNamedPipe(lpszPipename , ..)

然而,如果出于某种原因使用 lpszPipename - 它必须声明为指向常量字符串的指针。 LPCTSTR lpszPipename 而不是 LPTSTR lpszPipename


可能的下一个解决方案 - 在全局范围内声明

static const WCHAR gPipename[] = L"\\.\pipe\mynamedpipe";

并使用它,在二进制级别 CreateNamedPipeW(L"\\.\pipe\mynamedpipe"), ..)CreateNamedPipeW(gPipename, ..) 生成相同的代码