OSDN Git Service

#36057 コンフィグまわりのリファクタ(リソース不完全なので注意)
[dtxmania/dtxmania.git] / DTXManiaプロジェクト / コード / 全体 / Program.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.Globalization;\r
4 using System.Text;\r
5 using System.Runtime.InteropServices;\r
6 using System.Threading;\r
7 using System.Diagnostics;\r
8 using System.Windows.Forms;\r
9 using System.IO;\r
10 using FDK;\r
11 \r
12 namespace DTXMania\r
13 {\r
14         internal class Program\r
15         {\r
16                 #region [ 二重起動チェック、DLL存在チェック ]\r
17                 //-----------------------------\r
18                 private static Mutex mutex二重起動防止用;\r
19 \r
20                 private static bool tDLLの存在チェック(string strDll名, string str存在しないときに表示するエラー文字列jp, string str存在しないときに表示するエラー文字列en, bool bLoadDllCheck)\r
21                 {\r
22                         string str存在しないときに表示するエラー文字列 = (CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "ja") ?\r
23                                 str存在しないときに表示するエラー文字列jp : str存在しないときに表示するエラー文字列en;\r
24                         if (bLoadDllCheck)\r
25                         {\r
26                                 IntPtr hModule = LoadLibrary(strDll名);    // 実際にLoadDll()してチェックする\r
27                                 if (hModule == IntPtr.Zero)\r
28                                 {\r
29                                         MessageBox.Show(str存在しないときに表示するエラー文字列, "DTXMania runtime error", MessageBoxButtons.OK, MessageBoxIcon.Hand);\r
30                                         return false;\r
31                                 }\r
32                                 FreeLibrary(hModule);\r
33                         }\r
34                         else\r
35                         {                         // 単純にファイルの存在有無をチェックするだけ (プロジェクトで「参照」していたり、アンマネージドなDLLが暗黙リンクされるものはこちら)\r
36                                 string path = Path.Combine(System.IO.Directory.GetCurrentDirectory(), strDll名);\r
37                                 if (!File.Exists(path))\r
38                                 {\r
39                                         MessageBox.Show(str存在しないときに表示するエラー文字列, "DTXMania runtime error", MessageBoxButtons.OK, MessageBoxIcon.Hand);\r
40                                         return false;\r
41                                 }\r
42                         }\r
43                         return true;\r
44                 }\r
45                 private static bool tDLLの存在チェック(string strDll名, string str存在しないときに表示するエラー文字列jp, string str存在しないときに表示するエラー文字列en)\r
46                 {\r
47                         //return true;\r
48                         return tDLLの存在チェック(strDll名, str存在しないときに表示するエラー文字列jp, str存在しないときに表示するエラー文字列en, false);\r
49                 }\r
50 \r
51                 #region [DllImport]\r
52                 [DllImport("kernel32", CharSet = CharSet.Unicode, SetLastError = true)]\r
53                 internal static extern void FreeLibrary(IntPtr hModule);\r
54 \r
55                 [DllImport("kernel32", CharSet = CharSet.Unicode, SetLastError = true)]\r
56                 internal static extern IntPtr LoadLibrary(string lpFileName);\r
57                 #endregion\r
58                 //-----------------------------\r
59                 #endregion\r
60 \r
61                 [STAThread]\r
62                 private static void Main()\r
63                 {\r
64                         mutex二重起動防止用 = new Mutex(false, "DTXManiaMutex");\r
65 \r
66                         if (mutex二重起動防止用.WaitOne(0, false))\r
67                         {\r
68                                 string newLine = Environment.NewLine;\r
69                                 bool bDLLnotfound = false;\r
70 \r
71                                 Trace.WriteLine("Current Directory: " + Environment.CurrentDirectory);\r
72                                 Trace.WriteLine("EXEのあるフォルダ: " + Path.GetDirectoryName(Application.ExecutablePath));\r
73 \r
74                                 #region [DLLの存在チェック]\r
75                                 if (!tDLLの存在チェック("dll\\SlimDX" + CDTXMania.SLIMDXDLL + ".dll",\r
76                                         "SlimDX" + CDTXMania.SLIMDXDLL + ".dll またはその依存するdllが存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
77                                         "SlimDX" + CDTXMania.SLIMDXDLL + ".dll, or its depended DLL, is not found." + newLine + "Please download DTXMania again."\r
78                                         ))\r
79                                         bDLLnotfound = true;\r
80                                 if (!tDLLの存在チェック("dll\\FDK.dll",\r
81                                         "FDK.dll またはその依存するdllが存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
82                                         "FDK.dll, or its depended DLL, is not found." + newLine + "Please download DTXMania again."\r
83                                         ))\r
84                                         bDLLnotfound = true;\r
85                                 if (!tDLLの存在チェック("xadec.dll",   // #35444 2015.8.27 yyagi; Changed dll path\r
86                                         "xadec.dll が存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
87                                         "xadec.dll is not found." + newLine + "Please download DTXMania again."\r
88                                         ))\r
89                                         bDLLnotfound = true;\r
90                                 if (!tDLLの存在チェック("dll\\SoundDecoder.dll",\r
91                                         "SoundDecoder.dll またはその依存するdllが存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
92                                         "SoundDecoder.dll, or its depended DLL, is not found." + newLine + "Please download DTXMania again."\r
93                                         ))\r
94                                         bDLLnotfound = true;\r
95                                 if (!tDLLの存在チェック(CDTXMania.D3DXDLL,\r
96                                         CDTXMania.D3DXDLL + " が存在しません。" + newLine + "DirectX Redist フォルダの DXSETUP.exe を実行し、" + newLine + "必要な DirectX ランタイムをインストールしてください。",\r
97                                         CDTXMania.D3DXDLL + " is not found." + newLine + "Please execute DXSETUP.exe in \"DirectX Redist\" folder, to install DirectX runtimes required for DTXMania.",\r
98                                         true\r
99                                         ))\r
100                                         bDLLnotfound = true;\r
101                                 if (!tDLLの存在チェック("dll\\bass.dll",\r
102                                         "bass.dll が存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
103                                         "baas.dll is not found." + newLine + "Please download DTXMania again."\r
104                                         ))\r
105                                         bDLLnotfound = true;\r
106                                 if (!tDLLの存在チェック("dll\\Bass.Net.dll",\r
107                                         "Bass.Net.dll が存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
108                                         "Bass.Net.dll is not found." + newLine + "Please download DTXMania again."\r
109                                         ))\r
110                                         bDLLnotfound = true;\r
111                                 if (!tDLLの存在チェック("dll\\bassmix.dll",\r
112                                         "bassmix.dll を読み込めません。bassmix.dll か bass.dll が存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
113                                         "bassmix.dll is not loaded. bassmix.dll or bass.dll must not exist." + newLine + "Please download DTXMania again."\r
114                                         ))\r
115                                         bDLLnotfound = true;\r
116                                 if (!tDLLの存在チェック("dll\\bassasio.dll",\r
117                                         "bassasio.dll を読み込めません。bassasio.dll か bass.dll が存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
118                                         "bassasio.dll is not loaded. bassasio.dll or bass.dll must not exist." + newLine + "Please download DTXMania again."\r
119                                         ))\r
120                                         bDLLnotfound = true;\r
121                                 if (!tDLLの存在チェック("dll\\basswasapi.dll",\r
122                                         "basswasapi.dll を読み込めません。basswasapi.dll か bass.dll が存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
123                                         "basswasapi.dll is not loaded. basswasapi.dll or bass.dll must not exist." + newLine + "Please download DTXMania again."\r
124                                         ))\r
125                                         bDLLnotfound = true;\r
126                                 if (!tDLLの存在チェック("dll\\bass_fx.dll",\r
127                                         "bass_fx.dll を読み込めません。bass_fx.dll か bass.dll が存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
128                                         "bass_fx.dll is not loaded. bass_fx.dll or bass.dll must not exist." + newLine + "Please download DTXMania again."\r
129                                         ))\r
130                                         bDLLnotfound = true;\r
131                                 if (!tDLLの存在チェック("dll\\DirectShowLib-2005.dll",\r
132                                         "DirectShowLib-2005.dll が存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
133                                         "DirectShowLib-2005.dll is not found." + newLine + "Please download DTXMania again."\r
134                                         ))\r
135                                         bDLLnotfound = true;\r
136                                 #endregion\r
137                                 if (!bDLLnotfound)\r
138                                 {\r
139 #if DEBUG && TEST_ENGLISH\r
140                                         Thread.CurrentThread.CurrentCulture = new CultureInfo( "en-US" );\r
141 #endif\r
142 \r
143                                         DWM.EnableComposition(false); // Disable AeroGrass temporally\r
144 \r
145                                         // BEGIN #23670 2010.11.13 from: キャッチされない例外は放出せずに、ログに詳細を出力する。\r
146                                         // BEGIM #24606 2011.03.08 from: DEBUG 時は例外発生箇所を直接デバッグできるようにするため、例外をキャッチしないようにする。\r
147 #if !DEBUG\r
148                                         try\r
149 #endif\r
150                                         {\r
151                                                 CDTXMania.Instance.InitializeInstance();\r
152                                                 CDTXMania.Instance.Run();\r
153                                                 Trace.WriteLine("");\r
154                                                 Trace.WriteLine("遊んでくれてありがとう!");\r
155                                         }\r
156 #if !DEBUG\r
157                                         catch (Exception e)\r
158                                         {\r
159                                                 Trace.WriteLine("");\r
160                                                 Trace.Write(e.ToString());\r
161                                                 Trace.WriteLine("");\r
162                                                 Trace.WriteLine("エラーだゴメン!(涙");\r
163                                                 MessageBox.Show(e.ToString(), "DTXMania Error", MessageBoxButtons.OK, MessageBoxIcon.Error);    // #23670 2011.2.28 yyagi to show error dialog\r
164                                         }\r
165 #endif\r
166                                         // END #24606 2011.03.08 from\r
167                                         // END #23670 2010.11.13 from\r
168 \r
169                                         if (Trace.Listeners.Count > 1)\r
170                                                 Trace.Listeners.RemoveAt(1);\r
171                                 }\r
172 \r
173                                 // BEGIN #24615 2011.03.09 from: Mutex.WaitOne() が true を返した場合は、Mutex のリリースが必要である。\r
174 \r
175                                 mutex二重起動防止用.ReleaseMutex();\r
176                                 mutex二重起動防止用 = null;\r
177 \r
178                                 // END #24615 2011.03.09 from\r
179                         }\r
180                         else    // DTXManiaが既に起動中\r
181                         {\r
182 \r
183                                 // → 引数が0個の時はそのまま終了\r
184                                 // 1個( コンパクトモード or DTXV -S) か2個 (DTXV -Nxxx ファイル名)のときは、そのプロセスにコマンドラインを丸々投げて終了する\r
185 \r
186                                 for (int i = 0; i < 5; i++)   // 検索結果のハンドルがZeroになることがあるので、200ms間隔で5回リトライする\r
187                                 {\r
188                                         #region [ 既に起動中のDTXManiaプロセスを検索する。]\r
189                                         // このやり方だと、ShowInTaskbar=falseでタスクバーに表示されないパターンの時に検索に失敗するようだが\r
190                                         // DTXManiaでそのパターンはない?のでこのままいく。\r
191                                         // FindWindowを使えばこのパターンにも対応できるが、C#でビルドするアプリはウインドウクラス名を自前指定できないので、これは使わない。\r
192 \r
193                                         Process current = Process.GetCurrentProcess();\r
194                                         Process[] running = Process.GetProcessesByName(current.ProcessName);\r
195                                         Process target = null;\r
196                                         //IntPtr hWnd = FindWindow( null, "DTXMania .NET style release " + CDTXMania.VERSION );\r
197 \r
198                                         foreach (Process p in running)\r
199                                         {\r
200                                                 if (p.Id != current.Id) // プロセス名は同じでかつ、プロセスIDが自分自身とは異なるものを探す\r
201                                                 {\r
202                                                         if (p.MainModule.FileName == current.MainModule.FileName && p.MainWindowHandle != IntPtr.Zero)\r
203                                                         {\r
204                                                                 target = p;\r
205                                                                 break;\r
206                                                         }\r
207                                                 }\r
208                                         }\r
209                                         #endregion\r
210 \r
211                                         #region [ 起動中のDTXManiaがいれば、そのプロセスにコマンドラインを投げる ]\r
212                                         if (target != null)\r
213                                         {\r
214                                                 string[] commandLineArgs = Environment.GetCommandLineArgs();\r
215                                                 if (commandLineArgs != null && commandLineArgs.Length > 1)\r
216                                                 {\r
217                                                         string arg = null;\r
218                                                         for (int j = 1; j < commandLineArgs.Length; j++)\r
219                                                         {\r
220                                                                 if (j == 1)\r
221                                                                 {\r
222                                                                         arg += commandLineArgs[j];\r
223                                                                 }\r
224                                                                 else\r
225                                                                 {\r
226                                                                         arg += " " + "\"" + commandLineArgs[j] + "\"";\r
227                                                                 }\r
228                                                         }\r
229 \r
230                                                         //Trace.TraceInformation( "Message=" + arg + ", len(w/o null)=" + arg.Length );\r
231 \r
232                                                         if (arg != null)\r
233                                                         {\r
234                                                                 FDK.CSendMessage.sendmessage(target.MainWindowHandle, current.MainWindowHandle, arg);\r
235                                                         }\r
236                                                 }\r
237                                                 break;\r
238                                         }\r
239                                         #endregion\r
240                                         else\r
241                                         {\r
242                                                 Trace.TraceInformation("メッセージ送信先のプロセスが見つからず。5回リトライします。");\r
243                                                 Thread.Sleep(200);\r
244                                         }\r
245                                 }\r
246                         }\r
247                 }\r
248         }\r
249 }\r