OSDN Git Service

1835d00953aa42ad26203822926b45923db0d0f0
[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 tDLLの存在チェック( strDll名, str存在しないときに表示するエラー文字列jp, str存在しないときに表示するエラー文字列en, false );\r
48                 }\r
49 \r
50                 #region [DllImport]\r
51                 [DllImport( "kernel32", CharSet = CharSet.Unicode, SetLastError = true )]\r
52                 internal static extern void FreeLibrary( IntPtr hModule );\r
53 \r
54                 [DllImport( "kernel32", CharSet = CharSet.Unicode, SetLastError = true )]\r
55                 internal static extern IntPtr LoadLibrary( string lpFileName );\r
56                 #endregion\r
57                 //-----------------------------\r
58                 #endregion\r
59 \r
60                 [STAThread] \r
61                 private static void Main()\r
62                 {\r
63                         mutex二重起動防止用 = new Mutex( false, "DTXManiaMutex" );\r
64 \r
65                         if ( mutex二重起動防止用.WaitOne( 0, false ) )\r
66                         {\r
67                                 string newLine = Environment.NewLine;\r
68                                 bool bDLLnotfound = false;\r
69 \r
70                                 #region [DLLの存在チェック]\r
71                                 if ( !tDLLの存在チェック( "dll\\SlimDX" + CDTXMania.SLIMDXDLL + ".dll",\r
72                                         "SlimDX" + CDTXMania.SLIMDXDLL + ".dll またはその依存するdllが存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
73                                         "SlimDX" + CDTXMania.SLIMDXDLL + ".dll, or its depended DLL, is not found." + newLine + "Please download DTXMania again."\r
74                                         ) ) bDLLnotfound = true;\r
75                                 if ( !tDLLの存在チェック( "dll\\FDK.dll",\r
76                                         "FDK.dll またはその依存するdllが存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
77                                         "FDK.dll, or its depended DLL, is not found." + newLine + "Please download DTXMania again."\r
78                                         ) ) bDLLnotfound = true;\r
79                                 if ( !tDLLの存在チェック( "dll\\xadec.dll",\r
80                                         "xadec.dll が存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
81                                         "xadec.dll is not found." + newLine + "Please download DTXMania again."\r
82                                         ) ) bDLLnotfound = true;\r
83                                 if ( !tDLLの存在チェック( "dll\\SoundDecoder.dll",\r
84                                         "SoundDecoder.dll またはその依存するdllが存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
85                                         "SoundDecoder.dll, or its depended DLL, is not found." + newLine + "Please download DTXMania again."\r
86                                         ) ) bDLLnotfound = true;\r
87                                 if ( !tDLLの存在チェック( CDTXMania.D3DXDLL,\r
88                                         CDTXMania.D3DXDLL + " が存在しません。" + newLine + "DirectX Redist フォルダの DXSETUP.exe を実行し、" + newLine + "必要な DirectX ランタイムをインストールしてください。",\r
89                                         CDTXMania.D3DXDLL + " is not found." + newLine + "Please execute DXSETUP.exe in \"DirectX Redist\" folder, to install DirectX runtimes required for DTXMania.",\r
90                                         true\r
91                                         ) ) bDLLnotfound = true;\r
92                                 if ( !tDLLの存在チェック( "dll\\bass.dll",\r
93                                         "bass.dll が存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
94                                         "baas.dll is not found." + newLine + "Please download DTXMania again."\r
95                                         ) ) bDLLnotfound = true;\r
96                                 if ( !tDLLの存在チェック( "dll\\Bass.Net.dll",\r
97                                         "Bass.Net.dll が存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
98                                         "Bass.Net.dll is not found." + newLine + "Please download DTXMania again."\r
99                                         ) ) bDLLnotfound = true;\r
100                                 if ( !tDLLの存在チェック( "dll\\bassmix.dll",\r
101                                         "bassmix.dll を読み込めません。bassmix.dll か bass.dll が存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
102                                         "bassmix.dll is not loaded. bassmix.dll or bass.dll must not exist." + newLine + "Please download DTXMania again."\r
103                                         ) ) bDLLnotfound = true;\r
104                                 if ( !tDLLの存在チェック( "dll\\bassasio.dll",\r
105                                         "bassasio.dll を読み込めません。bassasio.dll か bass.dll が存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
106                                         "bassasio.dll is not loaded. bassasio.dll or bass.dll must not exist." + newLine + "Please download DTXMania again."\r
107                                         ) ) bDLLnotfound = true;\r
108                                 if ( !tDLLの存在チェック( "dll\\basswasapi.dll",\r
109                                         "basswasapi.dll を読み込めません。basswasapi.dll か bass.dll が存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
110                                         "basswasapi.dll is not loaded. basswasapi.dll or bass.dll must not exist." + newLine + "Please download DTXMania again."\r
111                                         ) ) bDLLnotfound = true;\r
112                                 if ( !tDLLの存在チェック( "dll\\bass_fx.dll",\r
113                                         "bass_fx.dll を読み込めません。bass_fx.dll か bass.dll が存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
114                                         "bass_fx.dll is not loaded. bass_fx.dll or bass.dll must not exist." + newLine + "Please download DTXMania again."\r
115                                         ) ) bDLLnotfound = true;\r
116                                 if ( !tDLLの存在チェック( "dll\\DirectShowLib-2005.dll",\r
117                                         "DirectShowLib-2005.dll が存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
118                                         "DirectShowLib-2005.dll is not found." + newLine + "Please download DTXMania again."\r
119                                         ) ) bDLLnotfound = true;\r
120                                 #endregion\r
121                                 if ( !bDLLnotfound )\r
122                                 {\r
123 #if DEBUG && TEST_ENGLISH\r
124                                         Thread.CurrentThread.CurrentCulture = new CultureInfo( "en-US" );\r
125 #endif\r
126 \r
127                                         DWM.EnableComposition( false ); // Disable AeroGrass temporally\r
128 \r
129                                         // BEGIN #23670 2010.11.13 from: キャッチされない例外は放出せずに、ログに詳細を出力する。\r
130                                         // BEGIM #24606 2011.03.08 from: DEBUG 時は例外発生箇所を直接デバッグできるようにするため、例外をキャッチしないようにする。\r
131 #if !DEBUG\r
132                                         try\r
133 #endif\r
134                                         {\r
135                                                 using ( var mania = new CDTXMania() )\r
136                                                         mania.Run();\r
137 \r
138                                                 Trace.WriteLine( "" );\r
139                                                 Trace.WriteLine( "遊んでくれてありがとう!" );\r
140                                         }\r
141 #if !DEBUG\r
142                                         catch( Exception e )\r
143                                         {\r
144                                                 Trace.WriteLine( "" );\r
145                                                 Trace.Write( e.ToString() );\r
146                                                 Trace.WriteLine( "" );\r
147                                                 Trace.WriteLine( "エラーだゴメン!(涙" );\r
148                                                 MessageBox.Show( e.ToString(), "DTXMania Error", MessageBoxButtons.OK, MessageBoxIcon.Error );  // #23670 2011.2.28 yyagi to show error dialog\r
149                                         }\r
150 #endif\r
151                                         // END #24606 2011.03.08 from\r
152                                         // END #23670 2010.11.13 from\r
153 \r
154                                         if ( Trace.Listeners.Count > 1 )\r
155                                                 Trace.Listeners.RemoveAt( 1 );\r
156                                 }\r
157 \r
158                                 // BEGIN #24615 2011.03.09 from: Mutex.WaitOne() が true を返した場合は、Mutex のリリースが必要である。\r
159 \r
160                                 mutex二重起動防止用.ReleaseMutex();\r
161                                 mutex二重起動防止用 = null;\r
162 \r
163                                 // END #24615 2011.03.09 from\r
164                         }\r
165                         else            // DTXManiaが既に起動中\r
166                         {\r
167                                 \r
168                                 // → 引数が0個の時はそのまま終了\r
169                                 // 1個( コンパクトモード or DTXV -S) か2個 (DTXV -Nxxx ファイル名)のときは、そのプロセスにコマンドラインを丸々投げて終了する\r
170 \r
171                                 #region [ 既に起動中のDTXManiaプロセスを検索する。]\r
172                                 // このやり方だと、ShowInTaskbar=falseでタスクバーに表示されないパターンの時に検索に失敗するようだが\r
173                                 // DTXManiaでそのパターンはない?のでこのままいく。\r
174                                 // FindWindowを使えばこのパターンにも対応できるが、C#でビルドするアプリはウインドウクラス名を自前指定できないので、これは使わない。\r
175 \r
176                                 Process current = Process.GetCurrentProcess();\r
177                                 Process[] running = Process.GetProcessesByName( current.ProcessName );\r
178                                 Process target = null;\r
179                                 //IntPtr hWnd = FindWindow( null, "DTXMania .NET style release " + CDTXMania.VERSION );\r
180 \r
181                                 foreach ( Process p in running )\r
182                                 {\r
183                                         if ( p.Id != current.Id )       // プロセス名は同じでかつ、プロセスIDが自分自身とは異なるものを探す\r
184                                         {\r
185                                                 if ( p.MainModule.FileName == current.MainModule.FileName )\r
186                                                 {\r
187                                                         target = p;\r
188                                                         break;\r
189                                                 }\r
190                                         }\r
191                                 }\r
192                                 #endregion\r
193 \r
194                                 #region [ 起動中のDTXManiaがいれば、そのプロセスにコマンドラインを投げる ]\r
195                                 if ( target != null )\r
196                                 {\r
197                                         string[] commandLineArgs = Environment.GetCommandLineArgs();\r
198                                         if ( commandLineArgs != null && commandLineArgs.Length > 1 )\r
199                                         {\r
200                                                 string arg = null;\r
201                                                 for ( int i = 1; i < commandLineArgs.Length; i++ )\r
202                                                 {\r
203                                                         if ( i == 1 )\r
204                                                         {\r
205                                                                 arg += commandLineArgs[ i ];\r
206                                                         }\r
207                                                         else\r
208                                                         {\r
209                                                                 arg += " " + "\"" + commandLineArgs[ i ] + "\"";\r
210                                                         }\r
211                                                 }\r
212 \r
213 Trace.TraceInformation( "Message=" + arg + ", len(w/o null)=" + arg.Length );\r
214 \r
215                                                 if ( arg != null )\r
216                                                 {\r
217                                                         FDK.CSendMessage.sendmessage( target.MainWindowHandle, current.MainWindowHandle, arg );\r
218                                                 }\r
219                                         }\r
220                                 }\r
221                                 #endregion\r
222                         }\r
223                 }\r
224         }\r
225 }\r