2017-12-14 53 views
0

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を示しています。私が本当にわからない理由のために、ベクトルの他の要素は追加されません。

答えて

0

それはラインためです: SS < < *それ< < L」「;

ストリームにNULを配置すると、メッセージボックスがそこで停止します。それをストリームにコピーする必要があります。begin() - > end() - 1

+0

テスト環境でローカルベクトルと同じことをしましたが、それは動作し、文字列にNULL文字は含まれていません。 –

+0

私はss.write(it-> c_str()、it-> size() - 1)しました。それは動作しますが、別のプログラムで動作する理由を教えてくれません –

関連する問題