用const char *连接LPTSTR(Win32 C ++)

时间:2016-02-03 14:05:17

标签: c++ file winapi editbox lptstr

我希望能够在Win32应用程序中打开一个文件。 我正在使用的方法是从编辑框中检索根路径,例如“C:\ MyFolder”(已分配给strPathToSource)。然后我想追加另一个字符串,例如“\ source \ Utilities \ File.h”并将连接的路径存储在新变量strPathToFile中。

所以strPathToFile应该包含“C:\ MyFolder \ source \ Utilities \ File.h”,然后可以使用infile.open(strPathToFile)打开它。

相关代码如下所示:

ifstream infile;

int bufSize = 1024;
LPTSTR strPathToSource = new TCHAR[bufSize];
GetDlgItemText(hWnd, IDC_MAIN_EDIT_FILEPATH, strPathToSource, bufSize); // Get text from edit box and assign to strPathToSource

const char* strPathToFile = char(strPathToSource) + PATH_TO_FILE;
infile.open(strPathToFile);
if(!infile)
{
    log(hWnd, "File.h not found.");
    return false;
}

PATH_TO_FILE定义为:

const char* PATH_TO_FILE = "\\source\\Utilities\\File.h";

我的问题是它始终注销“File.h not found”。我认为问题在于连接,例如。

const char* strPathToFile = char(strPathToSource) + PATH_TO_FILE;

单步执行我可以看到strPathToSourcePATH_TO_FILE的值是应该的,但strPathToFile中的连接结果是我认为的NULL值。

2 个答案:

答案 0 :(得分:2)

添加两个字符指针不会连接字符串,它只是添加两个指针值(作为“数字”)。所以你最终会得到一个无效的指针。

此外,从LPTSTR到char *的类型转换不是一个好主意,因为TCHAR也可以是宽字符,具体取决于当前的构建设置。 (事实上​​,你正在将LPTSTR转换为char,而不是指针,这更加错误)

我认为最简单的方法是将两个字符串转换为std :: string(或wstring),在那里你可以使用'+'运算符来进行连接。

这样做的一种可能性:

const std::wstring strPathToFile = cvt2wstring(strPathToSource) + cvt2wstring(PATH_TO_FILE);

cvt2wstring定义为:

#include <codecvt>
#include <string>

std::wstring cvt2wstring(const char * str)
{
    std::wstring_convert<std::codecvt_utf8_utf16<wchar_t> > converter;
    return converter.from_bytes(str);
}

std::wstring cvt2wstring(const wchar_t * str)
{
    return str;
}

根据实际类型,应选择适当的过载。

对于std :: string的相反转换(这样你可以使用常规的std :: ifstream)你可以切换方向:

std::string cvt2string(const char * str)
{
    return str;
}

std::string cvt2string(const wchar_t * str)
{
    std::wstring_convert<std::codecvt_utf8_utf16<wchar_t> > converter;
    return converter.to_bytes(str);
}

对我来说,ifstream :: open()似乎与wstring一起工作(但它可能是MSVC扩展,因为C ++标准不提供 - 无论如何你使用TCHAR&amp; comp。你可能是Windows和MSVC的目标)

答案 1 :(得分:1)

Martin Bonner基本上给出了正确的答案。

简而言之,最好的解决方案是完全忽略TCHAR。这是一个可以追溯到上个世纪最后十年的拐杖,当时对于拥有4 MB RAM的PC而言,Unicode是一个问题。今天4 GB是常见的,是一千倍。

然而,如果你仍然希望生活在那个时代,那就要保持一致。不要定义

const char* PATH_TO_FILE = "\\source\\Utilities\\File.h";

但请使用

const TCHAR * PATH_TO_FILE = _T("\\source\\Utilities\\File.h");

另外,学会使用字符串连接。您可以使用std::basic_string<TCHAR>::operator+(简单)或tcscat(习惯缓冲溢出)。