【问题标题】:Can't append to a string in a COM Dll Strange behaviour无法附加到 COM Dll 奇怪行为中的字符串
【发布时间】:2018-05-29 02:25:54
【问题描述】:

我正在创建一个 Windows Shell 扩展,以通过制作 COM dll 在资源管理器上下文菜单中添加一些选项,但我遇到了一个奇怪的向量问题。

我正在尝试将包含路径的 std::vector(类成员)的内容附加到 std::wstring 中,但最后,只有一个路径添加到字符串中。我知道这是向量本身的问题,因为如果我用本地向量而不是 m_selectedFiles 替换向量,它就可以工作。

代码如下:

HRESULT FilesEncryptContextMenuHandler::InvokeCommand(CMINVOKECOMMANDINFO *pici) {
wchar_t filename[MAX_PATH] = {0};
GetModuleFileName((HMODULE)g_hInstance, filename, MAX_PATH);
std::wstring str = filename;
std::wstring exe = str.substr(0, str.find_last_of('\\')) + L"\\FilesEncrypt.exe";

std::basic_stringstream<wchar_t> ss;

for (std::vector<std::wstring>::iterator it = m_selectedFiles.begin(); it != m_selectedFiles.end(); ++it) {
    MessageBox(NULL, it->c_str(), L"Test", MB_OK);
    ss << *it << L" ";
}

std::wstring args = ss.str();
MessageBox(NULL, args.c_str(), L"Test", MB_OK);
args = args.substr(0, args.size() - 1);

ShellExecute(NULL, L"open", exe.c_str(), args.c_str(), NULL, SW_SHOWNA);
return S_OK;
}

这里,for循环中的MessageBox被多次调用,但第二个MessageBox只显示PATH1。由于一个我真的不知道的原因,向量中的其他元素没有附加。

【问题讨论】:

    标签: c++ vector dll com


    【解决方案1】:

    这是因为这行: ss

    在流中放置一个 NUL,消息框停在那里。您需要将 it->begin() 复制到 it->end()-1 到流中。

    【讨论】:

    • 我在测试环境中对本地向量做了同样的事情,它可以工作并且字符串不包含任何 NULL 字符。
    • 好吧,我做了 ss.write(it->c_str(), it->size() - 1);它有效,但它没有告诉我为什么它在另一个程序中有效
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    相关资源
    最近更新 更多