Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.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++ “没有合适的转换函数”;标准::wstring“;至;LPWSTR";存在于C++;_C++_C++11_Winapi - Fatal编程技术网

C++ “没有合适的转换函数”;标准::wstring“;至;LPWSTR";存在于C++;

C++ “没有合适的转换函数”;标准::wstring“;至;LPWSTR";存在于C++;,c++,c++11,winapi,C++,C++11,Winapi,通过使用下面的代码,我得到了路径“C:\ProgramFiles” 然后将“\Test\myupdate.exe”附加到它 之后,我将此路径存储在“pwszTaskTrigger”结构变量中,如下所示: mcTskInfo.pwszTaskTrigger = strexepath; 但是,在存储时,我收到一条警告消息(“不存在从“std::wstring”到“LPWSTR”的合适转换函数”): 以下是完整的代码: MCTASKINFO mcTskInfo = { 0 }; WCHAR szCo

通过使用下面的代码,我得到了路径“C:\ProgramFiles”

然后将“\Test\myupdate.exe”附加到它

之后,我将此路径存储在“pwszTaskTrigger”结构变量中,如下所示:

mcTskInfo.pwszTaskTrigger = strexepath;
但是,在存储时,我收到一条警告消息(“不存在从“std::wstring”到“LPWSTR”的合适转换函数”):

以下是完整的代码:

MCTASKINFO mcTskInfo = { 0 };
WCHAR szCommonFiles[MAX_PATH] = { 0 };
lRet = SHGetFolderPathW(NULL, CSIDL_PROGRAM_FILES, NULL, 0, szCommonFiles);
std::wstring strexepath = L"";
    strexepath.append(szCommonFiles);  //szCommonFiles gives the path "C:\\ProgramFiles"
    strexepath.append(ADD_MCUPDTPATH);
    mcTskInfo.pwszTaskTrigger = strexepath;

#define ADD_MCUPDTPATH          L"\\Test\\myupdate.exe"


struct MCTASKINFO
{

LPWSTR pwszTaskTrigger; 

};
在这里,我不应该将结构变量pwszTaskTrigger从LPWSTR更改为LPCWSTR。因为这个文件是包含文件

如何在不将LPWSTR更改为LPCWSTR的情况下解决此问题?

您可以使用:

mcTskInfo.pwszTaskTrigger = &strexepath[0];
或者,在C++17中,更具描述性并使用
数据

mcTskInfo.pwszTaskTrigger = strexepath.data();
但要特别确保没有任何东西通过该指针写入的长度超过字符串的长度,也不要在strexepath的生存期结束后使用它。

使用以下方法:

mcTskInfo.pwszTaskTrigger=const_cast<wchar_t*>(strexepath.c_str());

您可以通过获取指向字符串第一个元素的指针(如
&strexepath[0]
)轻松解决此错误。但是如果对象
strexepath
在指针之前结束生命并被销毁,那么这可能会导致其他错误。为什么不使用
mcTskInfo.pwszTaskTrigger=strexepath.c_str()?@Gupta那是
const wchar\u t*
@Quentin你什么意思?在C++11中,
data()
C_str()
是相同的,在C++17中,
data()
有一个重载,返回一个非常量指针。非常量
data()
只有在C++17之后才可用,这个问题有C++11标记。Hi Quentin,正如你提到的,我更改为:mcTskInfo.pwszTaskTrigger=strexepath.data();但它显示了错误消息:“const wchar_t*”类型的值不能分配给“LPWSTR”@JohnPaulCoder类型的实体,这是因为您使用的是C++11,sklott向我指出了这一点<代码>数据
自那时以来一直在更新,但您仅限于使用具有相同效果的
&strexepath[0]
。谢谢@Quentin,mcTskInfo.pwszTaskTrigger=&strexepath[0];我能用这个方法吗?mcTskInfo.pwszTaskTrigger=(LPWSTR)strupdatepath.c_str();--它也在工作。我在回答中添加了使用C样式转换的可能性。您不需要转换:
mcTskInfo.pwszTaskTrigger=&strexepath[0]
mcTskInfo.pwszTaskTrigger=strexepath.data()在C++17中。
mcTskInfo.pwszTaskTrigger = (LPWSTR)strupdatepath.c_str();