- PR -

16Bit版アプリケーションの判別方法について

1
投稿者投稿内容
moondog
大ベテラン
会議室デビュー日: 2003/04/11
投稿数: 165
投稿日時: 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()

以上、お手数をおかけしますがご教示のほど宜しくお願い致します。
ごん太
大ベテラン
会議室デビュー日: 2002/07/30
投稿数: 182
お住まい・勤務地: 森の中
投稿日時: 2009-03-04 17:09
VB6ですが、下記ソースでどうでしょうか?
この結果は「x64 〜」を取得します。

※円記号を使うとが変に変換されてしまう?ので実際使われる時は円記号に変えて下さい。

コード:
Dim strComputer, objWMIService, colSettings, objProcessor

strComputer = "."

Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate,authenticationLevel=Pkt}!円円" _
& strComputer & "円root円cimv2")

Set colSettings = objWMIService.ExecQuery _
("SELECT * FROM Win32_Processor")

For Each objProcessor In colSettings

MsgBox "Processor: " & objProcessor.Description
Next


moondog
大ベテラン
会議室デビュー日: 2003/04/11
投稿数: 165
投稿日時: 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

スマートな方法ではないと思うのですが、なんとか機能してるみたいです。^^;

ご教示頂いた方法もこの後試してみるつもりです。
ありがとうございました。
ごん太
大ベテラン
会議室デビュー日: 2002/07/30
投稿数: 182
お住まい・勤務地: 森の中
投稿日時: 2009-03-04 22:07
引用:

"16Bitアプリケーションの実行ファイルにはバージョン情報がない"
という判別方法があることが判りました。



なるほど、16bit APにはバージョン情報がないとは知りませんでした。

Azulean
大ベテラン
会議室デビュー日: 2008/01/04
投稿数: 123
お住まい・勤務地: 大阪府
投稿日時: 2009-03-04 22:52
32bitアプリケーションであっても、バージョン情報をつけないことは可能です。
大抵の場合、バージョン情報がついていると思いますが、フリーソフト等にはついていない可能性も残るので、バージョン情報の有無で判別するのはいかがなものかと思います。

下記のAPIとか手軽でよさそうですが、目的は果たせそうでしょうか?
http://msdn.microsoft.com/ja-jp/library/cc429268.aspx
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2009-03-04 23:15
実行ファイルのPEヘッダをみるという方法はダメ?
moondog
大ベテラン
会議室デビュー日: 2003/04/11
投稿数: 165
投稿日時: 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

スキルアップ/キャリアアップ(JOB@IT)