• R/O
  • SSH
  • HTTPS

sendtocmd: 提交


Commit MetaInfo

修訂53 (tree)
時間2008-03-03 03:08:35
作者bearmini

Log Message

* std::exception(const char*) なコンストラクタを使っているところがあったが、VC++ の独自拡張なので std::domain_error() に変えた
* ScopedComLibrary, ScopedComObjectPointer 型を導入して、COM ライブラリおよび COM オブジェクトのリソース解放漏れを確実に防ぐようにした。

Change Summary

差異

--- trunk/doc/Todo.txt (revision 52)
+++ trunk/doc/Todo.txt (revision 53)
@@ -1,11 +1,13 @@
11 Todo:
2-・Vista で「管理者として実行」できるようにする
3-
4-・コマンドラインオプションの処理を gflags とか使ってやるようにする
5-
62 ・複数ファイルを選択して送るときに、ウインドウ位置が同じところに重なって
73 起動するようになってしまったのでどうにかする。
84
5+・設定ファイルのフォーマットが変だったりするとどんな挙動を示すか不明なので
6+ ちゃんと調べてだめだったら直す
7+
8+
9+・ScopedWindowsResource クラスを作る?(CloseHandle() しないといけないリソースの保護)
10+
911 ・Windows Server 2003 で動作確認
1012 できれば x64 とか Longhorn Server とかも
1113
@@ -17,6 +19,8 @@
1719
1820 ・文字列リテラルのところをリソースなどから読み込むようにする
1921
22+・コマンドラインオプションの処理を gflags とか使ってやるようにする?
23+
2024 ・Doxygen 対応
2125
2226 ・自動ビルド
@@ -25,7 +29,8 @@
2529
2630 ・SendToCMD と SendToCygwin と SendToPS が似すぎているので
2731 もうちょっとうまい方法を考える
28-
32+ テンプレートとか
33+
2934 ・複数ファイルを1つのウインドウに送れるようにする。
3035 (Lhaz のようにいったんポップアップメニューを出して選ばせるとか)
3136
@@ -33,6 +38,7 @@
3338 ・Readme.txt を更新
3439 ・SendToCMD.rc のバージョン情報を更新
3540
41+
3642 DONE:
3743 ・アイコンをコマンドプロンプト標準のものを使う
3844 ・複数ファイルに対応する→ ファイル数に上限を設ける
@@ -65,4 +71,7 @@
6571 ・Cygwin や PS での UNC の扱いを確認する。
6672 -> Cygwin, PS ともに UNC なディレクトリにも対応していたので
6773 はじかないようにした。
74+
75+・Vista で「管理者として実行」できるようにする
76+
6877
\ No newline at end of file
--- trunk/src/Main/main.cpp (revision 52)
+++ trunk/src/Main/main.cpp (revision 53)
@@ -74,7 +74,11 @@
7474 {
7575 bearmini::MessageBox::Show(ex.what());
7676 }
77-
77+ catch (...)
78+ {
79+ bearmini::MessageBox::Show("予期せぬエラーが発生しました.");
80+ }
81+
7882 bearmini::DummyWindow::Teardown();
7983 return 0;
8084 }
--- trunk/src/Core/SystemInfo.cpp (revision 52)
+++ trunk/src/Core/SystemInfo.cpp (revision 53)
@@ -90,7 +90,7 @@
9090 ::UINT result = ::GetSystemDirectoryW(buf, _MAX_PATH);
9191 if (result == 0)
9292 {
93- throw std::exception("GetSystemDirectoryW() failed.");
93+ throw std::domain_error("GetSystemDirectoryW() failed.");
9494 }
9595
9696 return buf;
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
--- trunk/src/Core/ShellApi.cpp (revision 52)
+++ trunk/src/Core/ShellApi.cpp (revision 53)
@@ -38,7 +38,7 @@
3838 ::HRESULT hr = ::SHGetFolderPathW(0, CSIDL_SENDTO | CSIDL_FLAG_CREATE, 0, 0, buf);
3939 if (FAILED(hr))
4040 {
41- throw std::exception("SHGetFolderPathW() failed.");
41+ throw std::domain_error("SHGetFolderPathW() failed.");
4242 }
4343
4444 return buf;
--- trunk/src/Core/Console.cpp (revision 52)
+++ trunk/src/Core/Console.cpp (revision 53)
@@ -85,7 +85,7 @@
8585 ::BOOL ok = ::WriteConsoleInputW(m_hConin, inputs.InputArray(), inputs.Length(), &nWritten);
8686 if (!ok)
8787 {
88- throw std::exception("WriteConsoleInputW() failed.");
88+ throw std::domain_error("WriteConsoleInputW() failed.");
8989 }
9090 }
9191
@@ -103,7 +103,7 @@
103103 ::DWORD errorCode = ::GetLastError();
104104 std::stringstream ss;
105105 ss << "Could not attach to a console window." << std::endl << "Error Code: " << errorCode;
106- throw std::exception(ss.str().c_str());
106+ throw std::domain_error(ss.str().c_str());
107107 }
108108 }
109109
--- trunk/src/Core/Uncopyable.h (nonexistent)
+++ trunk/src/Core/Uncopyable.h (revision 53)
@@ -0,0 +1,45 @@
1+/*
2+ Copyright 2007 Takashi Oguma
3+
4+ This file is part of SendToCMD.
5+
6+ SendToCMD is free software; you can redistribute it and/or modify
7+ it under the terms of the GNU General Public License as published by
8+ the Free Software Foundation; either version 2 of the License, or
9+ (at your option) any later version.
10+
11+ SendToCMD is distributed in the hope that it will be useful,
12+ but WITHOUT ANY WARRANTY; without even the implied warranty of
13+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+ GNU General Public License for more details.
15+
16+ You should have received a copy of the GNU General Public License
17+ along with SendToCMD; if not, write to the Free Software
18+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19+
20+*/
21+
22+#pragma once
23+
24+
25+namespace bearmini
26+{
27+ /**
28+ * あるクラスがコピー禁止であることを明示するためのクラス.
29+ * コピーを禁止したいクラスからこのクラスを private 継承すればよい。
30+ */
31+ class Uncopyable
32+ {
33+ protected:
34+ Uncopyable()
35+ {
36+ } // 生成と破棄は許可する
37+ ~Uncopyable()
38+ {
39+ }
40+ private:
41+ Uncopyable(const Uncopyable&); // しかし、コピー(代入を含む)は禁止する
42+ Uncopyable& operator=(const Uncopyable&);
43+ };
44+
45+}
--- trunk/src/Core/Program.cpp (revision 52)
+++ trunk/src/Core/Program.cpp (revision 53)
@@ -52,7 +52,7 @@
5252 }
5353 else
5454 {
55- throw std::exception("実行ファイル名が書き換えられています.");
55+ throw std::domain_error("実行ファイル名が書き換えられています.");
5656 }
5757 }
5858
--- trunk/src/Core/ScopedComObjectPointer.h (nonexistent)
+++ trunk/src/Core/ScopedComObjectPointer.h (revision 53)
@@ -0,0 +1,60 @@
1+/*
2+ Copyright 2007 Takashi Oguma
3+
4+ This file is part of SendToCMD.
5+
6+ SendToCMD is free software; you can redistribute it and/or modify
7+ it under the terms of the GNU General Public License as published by
8+ the Free Software Foundation; either version 2 of the License, or
9+ (at your option) any later version.
10+
11+ SendToCMD is distributed in the hope that it will be useful,
12+ but WITHOUT ANY WARRANTY; without even the implied warranty of
13+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+ GNU General Public License for more details.
15+
16+ You should have received a copy of the GNU General Public License
17+ along with SendToCMD; if not, write to the Free Software
18+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19+
20+*/
21+
22+#pragma once
23+
24+// Windows headers
25+#include <shlobj.h>
26+
27+// private headers
28+#include "Uncopyable.h"
29+
30+
31+namespace bearmini
32+{
33+ template<typename T>
34+ class ScopedComObjectPointer : private Uncopyable
35+ {
36+ public:
37+ ScopedComObjectPointer() : pComObject(0)
38+ {
39+ }
40+
41+ ~ScopedComObjectPointer()
42+ {
43+ pComObject->Release();
44+ }
45+
46+ T** operator &()
47+ {
48+ return &pComObject;
49+ }
50+
51+ T* operator ->()
52+ {
53+ return pComObject;
54+ }
55+
56+ private:
57+ T* pComObject;
58+ };
59+
60+}
--- trunk/src/Core/Process.cpp (revision 52)
+++ trunk/src/Core/Process.cpp (revision 53)
@@ -108,7 +108,7 @@
108108 ::BOOL ok = ::CreateProcessW(0, (::LPWSTR)m_path.c_str(), 0, 0, FALSE, CREATE_NEW_CONSOLE, 0, workdir, &si, &pi);
109109 if (!ok)
110110 {
111- throw std::exception("Failed to start the process.");
111+ throw std::domain_error("Failed to start the process.");
112112 }
113113
114114 m_hProcess = pi.hProcess;
@@ -142,7 +142,7 @@
142142 ::BOOL ok = ::ShellExecuteExW(&sei);
143143 if (!ok)
144144 {
145- throw std::exception("Failed to start the process.");
145+ throw std::domain_error("Failed to start the process.");
146146 }
147147
148148 m_hProcess = sei.hProcess;
@@ -206,12 +206,12 @@
206206
207207 if (!ok)
208208 {
209- throw std::exception("EnumWindows() failed.");
209+ throw std::domain_error("EnumWindows() failed.");
210210 }
211211
212212 if (++loop > 100)
213213 {
214- throw std::exception("WaitForConsoleAllocated() timed out.");
214+ throw std::domain_error("WaitForConsoleAllocated() timed out.");
215215 }
216216
217217 ::Sleep(100);
--- trunk/src/Core/ScopedComLibrary.h (nonexistent)
+++ trunk/src/Core/ScopedComLibrary.h (revision 53)
@@ -0,0 +1,65 @@
1+/*
2+ Copyright 2007 Takashi Oguma
3+
4+ This file is part of SendToCMD.
5+
6+ SendToCMD is free software; you can redistribute it and/or modify
7+ it under the terms of the GNU General Public License as published by
8+ the Free Software Foundation; either version 2 of the License, or
9+ (at your option) any later version.
10+
11+ SendToCMD is distributed in the hope that it will be useful,
12+ but WITHOUT ANY WARRANTY; without even the implied warranty of
13+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+ GNU General Public License for more details.
15+
16+ You should have received a copy of the GNU General Public License
17+ along with SendToCMD; if not, write to the Free Software
18+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19+
20+*/
21+
22+#pragma once
23+
24+// Windows headers
25+#include <shlobj.h>
26+
27+// private headers
28+#include "Uncopyable.h"
29+
30+
31+namespace bearmini
32+{
33+ ///
34+ /// C++ のスコープを利用して、COM ライブラリの初期化(CoInitialize)と解放(CoUninitialize)を
35+ /// 自動的に行うためのクラスです。
36+ ///
37+ /// 通常 CoInitialize() と CoUninitialize() は必ずペアで呼び出す必要があり、かつ、
38+ /// 各スレッドごとに初期化・解放を行う必要があります。
39+ /// (COM ライブラリは内部的に参照カウンタのようなものを持っているようで、
40+ /// 実際にメモリが解放されるのは最後に CoUninitialize() されてからのようです。)
41+ ///
42+ /// そのような理由から、COM ライブラリを使用する場合、なるべく局所的に、
43+ /// COM ライブラリの使用者の自己責任で COM ライブラリの初期化と解放を行うべきです。
44+ ///
45+ /// C++ のスコープを利用してそのような初期化と解放をなるべく自動的に行うためのクラスです。
46+ ///
47+ class ScopedComLibrary : private Uncopyable
48+ {
49+ public:
50+ ScopedComLibrary()
51+ {
52+ ::HRESULT hr = ::CoInitialize(0);
53+ if (FAILED(hr))
54+ {
55+ throw std::domain_error("CoInitialize() failed.");
56+ }
57+ }
58+
59+ ~ScopedComLibrary() throw()
60+ {
61+ ::CoUninitialize();
62+ }
63+ };
64+
65+}
--- trunk/src/Core/Shortcut.cpp (revision 52)
+++ trunk/src/Core/Shortcut.cpp (revision 53)
@@ -21,8 +21,9 @@
2121
2222 #include "Shortcut.h"
2323
24-// Windows headers
25-#include <shlobj.h>
24+// private headers
25+#include "ScopedComLibrary.h"
26+#include "ScopedComObjectPointer.h"
2627
2728
2829 namespace bearmini
@@ -42,23 +43,21 @@
4243 bool runasAdmin // 互換性タブの「管理者として実行」をチェックするかどうか
4344 )
4445 {
46+ // このスコープ内で COM ライブラリを使用する
47+ ScopedComLibrary scl;
48+
4549 ::HRESULT hr;
46- ::IShellLinkW* psl = 0;
47- ::IShellLinkDataList* pdl = 0;
48- ::IPersistFile* ppf = 0;
4950
50- // COM ライブラリを初期化する
51- hr = ::CoInitialize(0);
52- if (FAILED(hr))
53- {
54- throw std::exception("CoInitialize() failed.");
55- }
51+ ScopedComObjectPointer<::IShellLinkW> psl;
52+ ScopedComObjectPointer<::IShellLinkDataList> pdl;
53+ ScopedComObjectPointer<::IPersistFile> ppf;
5654
55+
5756 // IShellLink オブジェクトを作成しポインタを取得する
5857 hr = ::CoCreateInstance(::CLSID_ShellLink, 0, ::CLSCTX_INPROC_SERVER, ::IID_IShellLinkW, (void**)&psl);
5958 if (FAILED(hr))
6059 {
61- goto epilogue;
60+ throw std::domain_error("Failed to CoCreateInstance(CLSID_ShellLink).");
6261 }
6362
6463 // ショートカットを二次記憶装置に保存するため IPersistFile インターフェイスの問い合わせをおこなう
@@ -65,38 +64,38 @@
6564 hr = psl->QueryInterface(::IID_IPersistFile, (void**)&ppf);
6665 if (FAILED(hr))
6766 {
68- goto epilogue;
67+ throw std::domain_error("Failed to QueryInterface(IID_IPersistFile).");
6968 }
7069
7170 hr = psl->SetPath(pathTargetFile.c_str()); // ターゲットファイル
7271 if (FAILED(hr))
7372 {
74- goto epilogue;
73+ throw std::domain_error("Failed to SetPath().");
7574 }
7675 hr = psl->SetDescription(description.c_str()); // 説明
7776 if (FAILED(hr))
7877 {
79- goto epilogue;
78+ throw std::domain_error("Failed to SetDescription().");
8079 }
8180 hr = psl->SetArguments(args.c_str()); // 引数
8281 if (FAILED(hr))
8382 {
84- goto epilogue;
83+ throw std::domain_error("Failed to SetArguments().");
8584 }
8685 hr = psl->SetWorkingDirectory(workingDir.c_str()); // 作業ディレクトリ
8786 if (FAILED(hr))
8887 {
89- goto epilogue;
88+ throw std::domain_error("Failed to SetWorkingDirectory().");
9089 }
9190 hr = psl->SetIconLocation(pathIcon.c_str(), iIcon); // アイコン
9291 if (FAILED(hr))
9392 {
94- goto epilogue;
93+ throw std::domain_error("Failed to SetIconLocation().");
9594 }
9695 hr = psl->SetShowCmd(iShowCmd); // ウィンドウスタイル
9796 if (FAILED(hr))
9897 {
99- goto epilogue;
98+ throw std::domain_error("Failed to SetShowCmd().");
10099 }
101100
102101 if (runasAdmin)
@@ -104,7 +103,7 @@
104103 hr = psl->QueryInterface(::IID_IShellLinkDataList, (void**)&pdl);
105104 if (FAILED(hr))
106105 {
107- goto epilogue;
106+ throw std::domain_error("Failed to QueryInterface(IID_IShellLinkDataList).");
108107 }
109108
110109 DWORD dwFlags = 0;
@@ -111,7 +110,7 @@
111110 hr = pdl->GetFlags(&dwFlags);
112111 if (FAILED(hr))
113112 {
114- goto epilogue;
113+ throw std::domain_error("Failed to GetFlags().");
115114 }
116115
117116 if ((dwFlags & SLDF_RUNAS_USER) == 0)
@@ -119,7 +118,7 @@
119118 hr = pdl->SetFlags(dwFlags | SLDF_RUNAS_USER);
120119 if (FAILED(hr))
121120 {
122- goto epilogue;
121+ throw std::domain_error("Failed to SetFlags().");
123122 }
124123 }
125124 }
@@ -128,38 +127,15 @@
128127 hr = ppf->Save(pathLinkFile.c_str(), TRUE);
129128 if (FAILED(hr))
130129 {
131- goto epilogue;
130+ throw std::domain_error("Failed to Save().");
132131 }
133132
134133 hr = ppf->SaveCompleted(pathLinkFile.c_str());
135134 if (FAILED(hr))
136135 {
137- goto epilogue;
136+ throw std::domain_error("Failed to SaveCompleted().");
138137 }
139138
140- epilogue:
141- if (ppf != 0)
142- {
143- ppf->Release();
144- }
145-
146- if (pdl != 0)
147- {
148- pdl->Release();
149- }
150-
151- if (psl != 0)
152- {
153- psl->Release();
154- }
155-
156- // COM ライブラリを解放する
157- ::CoUninitialize();
158-
159- if (FAILED(hr))
160- {
161- throw std::exception("ショートカットの作成に失敗しました.");
162- }
163139 return hr;
164140 }
165141
--- trunk/src/Core/PrevilegeChecker.h (revision 52)
+++ trunk/src/Core/PrevilegeChecker.h (revision 53)
@@ -43,25 +43,25 @@
4343 ::BOOL ok = ::AllocateAndInitializeSid(&authority, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &m_pAdministratorsGroupSid);
4444 if (!ok)
4545 {
46- throw std::exception();
46+ throw std::domain_error("Failed to AllocateAndInitializeSid().");
4747 }
4848
4949 ok = ::OpenProcessToken(hProcess, TOKEN_QUERY|TOKEN_DUPLICATE|TOKEN_ASSIGN_PRIMARY, &hToken);
5050 if (!ok)
5151 {
52- throw std::exception();
52+ throw std::domain_error("Failed to OpenProcessToken().");
5353 }
5454
5555 ok = ::DuplicateTokenEx(hToken, 0, 0, SecurityImpersonation, TokenImpersonation, &hTokenDup);
5656 if (!ok)
5757 {
58- throw std::exception();
58+ throw std::domain_error("Failed to DuplicateTokenEx().");
5959 }
6060
6161 ok = ::CheckTokenMembership(hTokenDup, m_pAdministratorsGroupSid, &isMember);
6262 if (!ok)
6363 {
64- throw std::exception();
64+ throw std::domain_error("Failed to CheckTokenMembership().");
6565 }
6666 }
6767 catch (...)
--- trunk/src/Core/SendToCygwin.cpp (revision 52)
+++ trunk/src/Core/SendToCygwin.cpp (revision 53)
@@ -49,7 +49,7 @@
4949 // Cygwin.bat を実行するためのコマンドライン文字列を作成
5050 std::wstring commandLine = generateCommandLine();
5151
52- FOREACH(wstring_vector::const_iterator, path, args)
52+ FOREACH (wstring_vector::const_iterator, path, args)
5353 {
5454 std::wstring unquotedPath = Path::Unquote(*path);
5555 std::wstring workDir = getWorkDirectoryFor(unquotedPath);
@@ -116,7 +116,7 @@
116116
117117 if (args.size() > MAX_SIMULTANEOUS_EXEC_COUNT)
118118 {
119- throw std::exception("Too many files. \r\n\r\nIn order to change the number of PowerShell can be started, please modify the value of MAX_SIMULTANEOUS in SendToPS.ini file.");
119+ throw std::domain_error("Too many files. \r\n\r\nIn order to change the number of PowerShell can be started, please modify the value of MAX_SIMULTANEOUS in SendToPS.ini file.");
120120 }
121121 }
122122
@@ -321,7 +321,15 @@
321321 const std::wstring sendToCygwinExePath = getSendToCygwinExeFullPath();
322322 const std::wstring sendToCygwinExeDir = getSendToCygwinExeDirectory();
323323 const std::wstring description = L"ファイルやディレクトリを指定して Cygwin を起動します.";
324- Shortcut::Create(linkFilePath, sendToCygwinExePath, description, L"", sendToCygwinExeDir, L"");
324+
325+ try
326+ {
327+ Shortcut::Create(linkFilePath, sendToCygwinExePath, description, L"", sendToCygwinExeDir, L"");
328+ }
329+ catch (std::domain_error&)
330+ {
331+ throw std::domain_error("ショートカットの作成に失敗しました.");
332+ }
325333 }
326334
327335 // ショートカットを作成(管理者として実行)
@@ -331,7 +339,16 @@
331339 const std::wstring sendToCygwinExePath = getSendToCygwinExeFullPath();
332340 const std::wstring sendToCygwinExeDir = getSendToCygwinExeDirectory();
333341 const std::wstring description = L"ファイルやディレクトリを指定して Cygwin を起動します.";
334- Shortcut::Create(linkFilePath, sendToCygwinExePath, description, L"", sendToCygwinExeDir, L"", 0, 1, true);
342+
343+ try
344+ {
345+ Shortcut::Create(linkFilePath, sendToCygwinExePath, description, L"", sendToCygwinExeDir, L"", 0, 1, true);
346+ }
347+ catch (std::domain_error&)
348+ {
349+ throw std::domain_error("ショートカットの作成に失敗しました.");
350+ }
351+
335352 }
336353
337354 MessageBox::Show(this, L"インストールが完了しました.");
--- trunk/src/Core/SendToCMD.cpp (revision 52)
+++ trunk/src/Core/SendToCMD.cpp (revision 53)
@@ -48,7 +48,7 @@
4848
4949 const std::wstring commandLine = generateCommandLine();
5050
51- FOREACH(wstring_vector::const_iterator, path, args)
51+ FOREACH (wstring_vector::const_iterator, path, args)
5252 {
5353 std::wstring unquotedPath = Path::Unquote(*path);
5454 std::wstring workDir = getWorkDirectoryFor(unquotedPath);
@@ -108,13 +108,13 @@
108108
109109 if (args.size() > MAX_SIMULTANEOUS_EXEC_COUNT)
110110 {
111- throw std::exception("Too many files. \r\n\r\nIn order to change the number of PowerShell can be started, please modify the value of MAX_SIMULTANEOUS in SendToPS.ini file.");
111+ throw std::domain_error("Too many files. \r\n\r\nIn order to change the number of PowerShell can be started, please modify the value of MAX_SIMULTANEOUS in SendToPS.ini file.");
112112 }
113113
114114 // UNC ディレクトリには移動できないのでチェック(args の先頭だけチェックすればユースケース上十分だろうと思われる)
115115 if (Path::IsUNC(args.front()))
116116 {
117- throw std::exception("A UNC (path starts with '\\\\') is not supported. \r\n\r\nFiles or directories on a network cannot be sent to CMD.EXE.");
117+ throw std::domain_error("A UNC (path starts with '\\\\') is not supported. \r\n\r\nFiles or directories on a network cannot be sent to CMD.EXE.");
118118 }
119119
120120 }
@@ -144,7 +144,7 @@
144144 int result = ::GetSystemDirectoryW(sys_dir, BUFSIZ);
145145 if (result == 0)
146146 {
147- throw std::exception("GetSystemDirectory() failed.");
147+ throw std::domain_error("GetSystemDirectory() failed.");
148148 }
149149 path << sys_dir << L"\\cmd.exe";
150150
@@ -261,7 +261,15 @@
261261 const std::wstring sendToCmdExePath = getSendToCmdExeFullPath();
262262 const std::wstring sendToCmdExeDir = getSendToCmdExeDirectory();
263263 const std::wstring description = L"ファイルやディレクトリを指定してコマンドプロンプトを起動します.";
264- Shortcut::Create(linkFilePath, sendToCmdExePath, description, L"", sendToCmdExeDir, L"");
264+
265+ try
266+ {
267+ Shortcut::Create(linkFilePath, sendToCmdExePath, description, L"", sendToCmdExeDir, L"");
268+ }
269+ catch (std::domain_error&)
270+ {
271+ throw std::domain_error("ショートカットの作成に失敗しました.");
272+ }
265273 }
266274
267275 // ショートカットを作成(管理者として実行)
@@ -271,7 +279,15 @@
271279 const std::wstring sendToCmdExePath = getSendToCmdExeFullPath();
272280 const std::wstring sendToCmdExeDir = getSendToCmdExeDirectory();
273281 const std::wstring description = L"ファイルやディレクトリを指定してコマンドプロンプトを起動します.";
274- Shortcut::Create(linkFilePath, sendToCmdExePath, description, L"", sendToCmdExeDir, L"", 0, 1, true);
282+
283+ try
284+ {
285+ Shortcut::Create(linkFilePath, sendToCmdExePath, description, L"", sendToCmdExeDir, L"", 0, 1, true);
286+ }
287+ catch (std::domain_error&)
288+ {
289+ throw std::domain_error("ショートカットの作成に失敗しました.");
290+ }
275291 }
276292
277293 MessageBox::Show(this, L"インストールが完了しました.");
--- trunk/src/Core/RegistryKey.cpp (revision 52)
+++ trunk/src/Core/RegistryKey.cpp (revision 53)
@@ -39,7 +39,7 @@
3939 ::DWORD errorCode = ::GetLastError();
4040 std::stringstream ss;
4141 ss << "RegOpenKeyEx() failed." << std::endl << "Error Code: " << errorCode;
42- throw std::exception(ss.str().c_str());
42+ throw std::domain_error(ss.str().c_str());
4343 }
4444 }
4545
@@ -65,7 +65,7 @@
6565 ::LONG result = ::RegQueryValueExW(m_hKey, valueName.c_str(), 0, &type, 0, &size);
6666 if (result != ERROR_SUCCESS)
6767 {
68- throw std::exception("RegQueryValueEx() (to query size of the value) failed.");
68+ throw std::domain_error("RegQueryValueEx() (to query size of the value) failed.");
6969 }
7070
7171 FixedLengthArray<wchar_t> buf(size + 1, L'\0');
@@ -73,12 +73,12 @@
7373 result = ::RegQueryValueExW(m_hKey, valueName.c_str(), 0, &type, (LPBYTE)buf.get(), &size);
7474 if (result != ERROR_SUCCESS)
7575 {
76- throw std::exception("RegQueryValueEx() (to query the value) failed.");
76+ throw std::domain_error("RegQueryValueEx() (to query the value) failed.");
7777 }
7878
7979 if (type != REG_SZ)
8080 {
81- throw std::exception("Invalid registry subkey type.");
81+ throw std::domain_error("Invalid registry subkey type.");
8282 }
8383
8484 return buf.get();
--- trunk/src/Core/DummyWindow.cpp (revision 52)
+++ trunk/src/Core/DummyWindow.cpp (revision 53)
@@ -52,7 +52,7 @@
5252 {
5353 if (s_hWnd != 0)
5454 {
55- throw std::exception("DummyWindow is already initialized.");
55+ throw std::domain_error("DummyWindow is already initialized.");
5656 }
5757
5858 registerMyWindowClass(hInstance);
--- trunk/src/Core/debug.cpp (revision 52)
+++ trunk/src/Core/debug.cpp (revision 53)
@@ -21,8 +21,7 @@
2121
2222 #include "debug.h"
2323
24-#include <stdarg.h>
25-
24+#include <cstdarg>
2625 #include <cstdio>
2726
2827 #ifndef _UNICODE
--- trunk/src/Core/PopupMenu.cpp (revision 52)
+++ trunk/src/Core/PopupMenu.cpp (revision 53)
@@ -71,7 +71,7 @@
7171 ::BOOL ok = ::AppendMenuW(m_hMenu, MF_ENABLED | MF_STRING, id, caption.c_str());
7272 if (!ok)
7373 {
74- throw std::exception("AppendMenu() failed.");
74+ throw std::domain_error("AppendMenu() failed.");
7575 }
7676 }
7777
@@ -87,7 +87,7 @@
8787 ::BOOL oK = ::AppendMenuW(m_hMenu, MF_ENABLED | MF_STRING | MF_CHECKED, id, caption.c_str());
8888 if (!oK)
8989 {
90- throw std::exception("AppendMenu() failed.");
90+ throw std::domain_error("AppendMenu() failed.");
9191 }
9292 }
9393
@@ -115,7 +115,7 @@
115115 ::BOOL oK = ::InsertMenuItemW(m_hMenu, pos, fByPosition, &mii);
116116 if (!oK)
117117 {
118- throw std::exception("InsertMenuItem() failed.");
118+ throw std::domain_error("InsertMenuItem() failed.");
119119 }
120120 }
121121
--- trunk/src/Core/Path.cpp (revision 52)
+++ trunk/src/Core/Path.cpp (revision 53)
@@ -204,7 +204,7 @@
204204 LPWSTR pTail = ::PathAddBackslashW(buf);
205205 if (pTail == 0)
206206 {
207- throw std::exception("PathAddBackslash() failed.");
207+ throw std::domain_error("PathAddBackslash() failed.");
208208 }
209209
210210 return buf;
@@ -290,7 +290,7 @@
290290 if (hFind == INVALID_HANDLE_VALUE)
291291 {
292292 ::FindClose(hFind);
293- throw std::exception("FindFirstFileW() failed.");
293+ throw std::domain_error("FindFirstFileW() failed.");
294294 }
295295 ::FindClose(hFind);
296296
--- trunk/src/Core/MessageBox.cpp (revision 52)
+++ trunk/src/Core/MessageBox.cpp (revision 53)
@@ -19,7 +19,7 @@
1919
2020 */
2121
22-#include "Messagebox.h"
22+#include "MessageBox.h"
2323
2424 #include "Path.h"
2525 #include "Program.h"
Show on old repository browser