- - PR -
16Bit版アプリケーションの判別方法について
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2009-03-04 15:35
お世話さまです。
Win2008R2からは全て64ビットOSになり、16ビットアプリは動作しないとのこと。 そこで、アプリケーションのプロセス型(16,32,64)を判別するプログラムを VB.NET2005で作ろうと思っているのですが、どこにそんな情報がスタック されているのでしょうか?^^; 下記のようなカンジで現在実行中の全プロセス名と型をリストボックスに 表示したいのですが、Processのプロパティに判別可能な属性があるんで しょうか? Dim myProc As Process lstProc.Items.Clear() lstProc.BeginUpdate() For Each myProc In Process.GetProcesses Try lstProc.Items.Add(myProc.ProcessName.ToString & " : " & _ myProc.???.ToString) Catch ex As Exception Debug.Writeline(ex.ToString) End Try Next lstProc.EndUpdate() 以上、お手数をおかけしますがご教示のほど宜しくお願い致します。 | ||||
|
投稿日時: 2009-03-04 17:09
VB6ですが、下記ソースでどうでしょうか?
この結果は「x64 〜」を取得します。 ※円記号を使うとが変に変換されてしまう?ので実際使われる時は円記号に変えて下さい。
| ||||
|
投稿日時: 2009-03-04 17:40
ごん太さん、早速のレスありがとうございます。
実は、あの後MSのサイトを漁っていたところ、 ”16Bitアプリケーションの実行ファイルにはバージョン情報がない” という判別方法があることが判りました。 で、それを基に下記のようなコードを作って実装してみました。 Dim FileVersion As String For Each myProc In Process.GetProcesses Try FileVersion = myProc.MainModule.FileVersionInfo.FileVersion.ToString Catch ex As Exception Try lstProc.Items.Add(myProc.ProcessName.ToString & " : " & _ myProc.MainModule.ModuleName.ToString) Catch ex2 As Exception End Try End Try Next スマートな方法ではないと思うのですが、なんとか機能してるみたいです。^^; ご教示頂いた方法もこの後試してみるつもりです。 ありがとうございました。 | ||||
|
投稿日時: 2009-03-04 22:07
なるほど、16bit APにはバージョン情報がないとは知りませんでした。 | ||||
|
投稿日時: 2009-03-04 22:52
32bitアプリケーションであっても、バージョン情報をつけないことは可能です。
大抵の場合、バージョン情報がついていると思いますが、フリーソフト等にはついていない可能性も残るので、バージョン情報の有無で判別するのはいかがなものかと思います。 下記のAPIとか手軽でよさそうですが、目的は果たせそうでしょうか? http://msdn.microsoft.com/ja-jp/library/cc429268.aspx | ||||
|
投稿日時: 2009-03-04 23:15
実行ファイルのPEヘッダをみるという方法はダメ?
| ||||
|
投稿日時: 2009-03-05 15:23
こんにちは。
Azuleanさんからご教示あったAPI(GetBinaryType)を使って実装してみたところ 下記の2パターンが検出されました。 1.ファイルのバージョン情報がないのに32Bitバイナリと判定される。 2.ファイルのバージョン情報があるのに16Bitバイナリと判定される。 1のケースは問題ないのですが、2は一体どうしたものかと。(笑) ちなみに、2のケースが起こったのはexeファイルでなく、dllファイルでした。 この関数はバッチファイルやdllでは無効だという記事もネットにあった のですが、やはりdllの判定には使えないということでしょうか。 多くのdllが判定エラー(戻り値=0)で返ってくるのですが、判定可のdllで ケース2が発生してます。 dllの判定はバージョン情報のみで行うか、この関数の情報を加味するか (加味するにしても矛盾するケース2をどう扱うか)で迷ってます。^^; ご参考までにコードを記します。 ' 定数の宣言 Enum lpBinaryTypes As Long SCS_32BIT_BINARY = 0 SCS_DOS_BINARY = 1 SCS_WOW_BINARY = 2 SCS_PIF_BINARY = 3 SCS_POSIX_BINARY = 4 SCS_OS216_BINARY = 5 End Enum <DllImport("kernel32.dll")> _ Private Shared Function GetBinaryType _ (ByVal lpApplicationName As String, _ ByRef lpBinaryTypes As lpBinaryTypes) As Boolean End Function Dim BinType As Long Dim Ret As Long Try '実行ファイルのみ対象とする If System.IO.Path.GetExtension(InFile).ToLower = ".exe" Or _ System.IO.Path.GetExtension(InFile).ToLower = ".dll" Then Ret = GetBinaryType(InFile, BinType) If Ret = 0 Then Debug.WriteLine(InFile & " : Err") Else Select Case BinType Case lpBinaryTypes.SCS_32BIT_BINARY Debug.WriteLine(InFile & " : SCS_32BIT_BINARY") Case lpBinaryTypes.SCS_DOS_BINARY Debug.WriteLine(InFile & " : SCS_DOS_BINARY") Case lpBinaryTypes.SCS_WOW_BINARY Debug.WriteLine(InFile & " : SCS_WOW_BINARY") Case lpBinaryTypes.SCS_PIF_BINARY Debug.WriteLine(InFile & " : SCS_PIF_BINARY") Case lpBinaryTypes.SCS_POSIX_BINARY Debug.WriteLine(InFile & " : SCS_POSIX_BINARY") Case lpBinaryTypes.SCS_OS216_BINARY Debug.WriteLine(InFile & " : SCS_OS216_BINARY") Case Else Debug.WriteLine(InFile & " : Other") End Select End If Catch ex As Exception MsgBox(ex.ToString) Exit Sub End Try |
1