Windowsシェル拡張を作成して、エクスプローラのコンテキストメニューにCOM dllを作成するオプションを追加しましたが、ベクターに奇妙な問題が発生します。COM Dllの文字列に追加できません奇妙な動作
std :: vector(クラスのメンバー)の内容にstd :: wstringへのパスが含まれていますが、最後にはその文字列に1つのパスしか追加されません。私はこれがベクトル自体の問題であることを知っています。なぜなら、ベクトルを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ループ内のメッセージボックスは、パスを複数回呼び出すが、第二のメッセージボックスのみPATH1を示しています。私が本当にわからない理由のために、ベクトルの他の要素は追加されません。
テスト環境でローカルベクトルと同じことをしましたが、それは動作し、文字列にNULL文字は含まれていません。 –
私はss.write(it-> c_str()、it-> size() - 1)しました。それは動作しますが、別のプログラムで動作する理由を教えてくれません –