Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Can';t将命名管道名称指定给LPTSTR变量_C++_Winapi_Named Pipes - Fatal编程技术网

C++ Can';t将命名管道名称指定给LPTSTR变量

C++ Can';t将命名管道名称指定给LPTSTR变量,c++,winapi,named-pipes,C++,Winapi,Named Pipes,我已经习惯了win32 API的诡计,但这很烦人,我这次面临的问题是指定命名管道的名称,这就是我正在做的: LPTSTR lpszPipename = TEXT("\\\\.\\pipe\\mynamedpipe"); 这是,令人惊讶,令人惊讶,它没有编译并发出以下错误: E0144“const wchar_t*”类型的值不能用于初始化“LPTSTR”类型的实体 现在一个cast将解决分配问题,但是我得到了一个109错误,你猜对了,error\u break\u PIPE

我已经习惯了win32 API的诡计,但这很烦人,我这次面临的问题是指定命名管道的名称,这就是我正在做的:

LPTSTR lpszPipename = TEXT("\\\\.\\pipe\\mynamedpipe"); 
这是,令人惊讶,令人惊讶,它没有编译并发出以下错误:

E0144“const wchar_t*”类型的值不能用于初始化“LPTSTR”类型的实体

现在一个cast将解决分配问题,但是我得到了一个109错误,你猜对了,
error\u break\u PIPE


我应该如何解决这个问题?

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

这是有效的C++(它仍然是有效的C,因此是样本),但是非常危险,所以在C++ 11中非法。您想要:

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


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

这是有效的C++(它仍然是有效的C,因此是样本),但是非常危险,所以在C++ 11中非法。您想要:

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


问题是,尽管有相反的说法,WiAPI文档中给出的例子是以(大部分)C而不是C++编写的。此外,在C++中,使用字符串文字来初始化非->代码const < /c>字符指针不再是允许的(因为C++ 11)。 因此,替换:

LPTSTR lpszPipename=TEXT(“\\\\.\\pipe\\mynamedpipe”);
与:

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

(无论是否修复您的代码> Error BurkyPix是另一回事,但是)

< P>问题是,尽管有相反的说法,WiAPI文档中给出的例子是以(大部分)C而不是C++编写的。此外,在C++中,使用字符串文字来初始化非->代码const < /c>字符指针不再是允许的(因为C++ 11)。 因此,替换:

LPTSTR lpszPipename=TEXT(“\\\\.\\pipe\\mynamedpipe”);
与:

TCHAR lpszPipename[]=TEXT(“\\\\.\\pipe\\mynamedpipe”);
(不过,这是否会修复您的
错误\u损坏的管道是另一回事!)

将指针指向常量字符串(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“\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\。所以直接做

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“\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\?需要是指向
const
的指针才能指向文字字符串。旧的MSVC用于允许这个,但后来的版本是更多的C++标准一致。@ ReHrdCurtIt如果它是,它不是我的,它来自微软,但它似乎使错误消失,我将要检查是否破裂的管道错误也消失了。你根本不需要声明<代码> LPSZPIPENAME< /COD>。将
“\\\.\\pipe\\mynamedpipe”
直接传递到
CreateNamedPipeW
ERROR\u break\u PIPE
-绝对是另一个问题和问题更改
LPTSTR
->
LPCTSTR
-打字错误?需要是指向
const
的指针才能指向文字字符串。旧的MSVC用于允许这个,但后来的版本是更多的C++标准一致。@ ReHrdCurtIt如果它是,它不是我的,它来自微软,但它似乎使错误消失,我将要检查是否破裂的管道错误也消失了。你根本不需要声明<代码> LPSZPIPENAME< /COD>。将
“\\\.\\pipe\\mynamedpipe”
直接传递到
CreateNamedPipeW
错误\u管道破裂
-绝对是另一个问题和疑问我真的希望microsoft文档中没有那么多小精灵,但这将是我的第二选择;)我使用的是
const_cast
@anastaciu,而不是讨厌的cast,只需使用数组语法即可。如果代码试图变异字符串文字,则任何类型转换都无法拯救您。@anastaciu请记住,数组的生存期将不同于字符串文字。@anastaciu很高兴我们能提供帮助!我真的希望微软的文档中没有那么多小精灵,但这将是我的第二选择;)我使用的是
const_cast
@anastaciu,而不是讨厌的cast,只需使用数组语法即可。如果代码试图变异字符串文字,则任何类型转换都无法拯救您。@anastaciu请记住,数组的生存期将不同于字符串文字。@anastaciu很高兴我们能提供帮助!请注意,即使在最新的Visual Studio中,您链接的示例中的代码也编译为C(尽管有一系列关于
printf
格式不匹配的警告)。当然不需要这种替换。可能的
LPCTSTR lpszPipename=TEXT(“\\\\.\\pipe\\mynamedpipe”)替换。但这通常也不需要。只需
createnamedpipe(TEXT(“\\\.\\pipe\\mynamedpipe”),…)
这里甚至不需要任何
const\u cast
。api获取指向常量字符串的指针。原始代码中的2个错误-使用变量lpszPipename(用于它需要什么?)并错误地声明它-只需更改
LP