2 using System.Collections.Generic;
\r
3 using System.Globalization;
\r
5 using System.Runtime.InteropServices;
\r
6 using System.Threading;
\r
7 using System.Diagnostics;
\r
8 using System.Windows.Forms;
\r
14 internal class Program
\r
16 #region [ 二重起動チェック、DLL存在チェック ]
\r
17 //-----------------------------
\r
18 private static Mutex mutex二重起動防止用;
\r
20 private static bool tDLLの存在チェック(string strDll名, string str存在しないときに表示するエラー文字列jp, string str存在しないときに表示するエラー文字列en, bool bLoadDllCheck)
\r
22 string str存在しないときに表示するエラー文字列 = (CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "ja") ?
\r
23 str存在しないときに表示するエラー文字列jp : str存在しないときに表示するエラー文字列en;
\r
26 IntPtr hModule = LoadLibrary(strDll名); // 実際にLoadDll()してチェックする
\r
27 if (hModule == IntPtr.Zero)
\r
29 MessageBox.Show(str存在しないときに表示するエラー文字列, "DTXMania runtime error", MessageBoxButtons.OK, MessageBoxIcon.Hand);
\r
32 FreeLibrary(hModule);
\r
35 { // 単純にファイルの存在有無をチェックするだけ (プロジェクトで「参照」していたり、アンマネージドなDLLが暗黙リンクされるものはこちら)
\r
36 string path = Path.Combine(System.IO.Directory.GetCurrentDirectory(), strDll名);
\r
37 if (!File.Exists(path))
\r
39 MessageBox.Show(str存在しないときに表示するエラー文字列, "DTXMania runtime error", MessageBoxButtons.OK, MessageBoxIcon.Hand);
\r
45 private static bool tDLLの存在チェック(string strDll名, string str存在しないときに表示するエラー文字列jp, string str存在しないときに表示するエラー文字列en)
\r
48 return tDLLの存在チェック(strDll名, str存在しないときに表示するエラー文字列jp, str存在しないときに表示するエラー文字列en, false);
\r
52 [DllImport("kernel32", CharSet = CharSet.Unicode, SetLastError = true)]
\r
53 internal static extern void FreeLibrary(IntPtr hModule);
\r
55 [DllImport("kernel32", CharSet = CharSet.Unicode, SetLastError = true)]
\r
56 internal static extern IntPtr LoadLibrary(string lpFileName);
\r
58 //-----------------------------
\r
62 private static void Main()
\r
64 mutex二重起動防止用 = new Mutex(false, "DTXManiaMutex");
\r
66 if (mutex二重起動防止用.WaitOne(0, false))
\r
68 string newLine = Environment.NewLine;
\r
69 bool bDLLnotfound = false;
\r
71 Trace.WriteLine("Current Directory: " + Environment.CurrentDirectory);
\r
72 Trace.WriteLine("EXEのあるフォルダ: " + Path.GetDirectoryName(Application.ExecutablePath));
\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
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
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
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
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
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
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
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
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
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
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
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
135 bDLLnotfound = true;
\r
139 #if DEBUG && TEST_ENGLISH
\r
140 Thread.CurrentThread.CurrentCulture = new CultureInfo( "en-US" );
\r
143 DWM.EnableComposition(false); // Disable AeroGrass temporally
\r
145 // BEGIN #23670 2010.11.13 from: キャッチされない例外は放出せずに、ログに詳細を出力する。
\r
146 // BEGIM #24606 2011.03.08 from: DEBUG 時は例外発生箇所を直接デバッグできるようにするため、例外をキャッチしないようにする。
\r
151 CDTXMania.Instance.InitializeInstance();
\r
152 CDTXMania.Instance.Run();
\r
153 Trace.WriteLine("");
\r
154 Trace.WriteLine("遊んでくれてありがとう!");
\r
157 catch (Exception e)
\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
166 // END #24606 2011.03.08 from
\r
167 // END #23670 2010.11.13 from
\r
169 if (Trace.Listeners.Count > 1)
\r
170 Trace.Listeners.RemoveAt(1);
\r
173 // BEGIN #24615 2011.03.09 from: Mutex.WaitOne() が true を返した場合は、Mutex のリリースが必要である。
\r
175 mutex二重起動防止用.ReleaseMutex();
\r
176 mutex二重起動防止用 = null;
\r
178 // END #24615 2011.03.09 from
\r
180 else // DTXManiaが既に起動中
\r
183 // → 引数が0個の時はそのまま終了
\r
184 // 1個( コンパクトモード or DTXV -S) か2個 (DTXV -Nxxx ファイル名)のときは、そのプロセスにコマンドラインを丸々投げて終了する
\r
186 for (int i = 0; i < 5; i++) // 検索結果のハンドルがZeroになることがあるので、200ms間隔で5回リトライする
\r
188 #region [ 既に起動中のDTXManiaプロセスを検索する。]
\r
189 // このやり方だと、ShowInTaskbar=falseでタスクバーに表示されないパターンの時に検索に失敗するようだが
\r
190 // DTXManiaでそのパターンはない?のでこのままいく。
\r
191 // FindWindowを使えばこのパターンにも対応できるが、C#でビルドするアプリはウインドウクラス名を自前指定できないので、これは使わない。
\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
198 foreach (Process p in running)
\r
200 if (p.Id != current.Id) // プロセス名は同じでかつ、プロセスIDが自分自身とは異なるものを探す
\r
202 if (p.MainModule.FileName == current.MainModule.FileName && p.MainWindowHandle != IntPtr.Zero)
\r
211 #region [ 起動中のDTXManiaがいれば、そのプロセスにコマンドラインを投げる ]
\r
212 if (target != null)
\r
214 string[] commandLineArgs = Environment.GetCommandLineArgs();
\r
215 if (commandLineArgs != null && commandLineArgs.Length > 1)
\r
218 for (int j = 1; j < commandLineArgs.Length; j++)
\r
222 arg += commandLineArgs[j];
\r
226 arg += " " + "\"" + commandLineArgs[j] + "\"";
\r
230 //Trace.TraceInformation( "Message=" + arg + ", len(w/o null)=" + arg.Length );
\r
234 FDK.CSendMessage.sendmessage(target.MainWindowHandle, current.MainWindowHandle, arg);
\r
242 Trace.TraceInformation("メッセージ送信先のプロセスが見つからず。5回リトライします。");
\r