无法将命名管道名称分配给 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, ..)
生成相同的代码
我正在习惯 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, ..)
生成相同的代码