OSDN Git Service

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