- ベストアンサー
PCインストール済みのアプリケーション情報の取得方法
- VB6を使用してパソコンのシステム調査において、インストール済みのアプリケーション情報を取得する方法についての質問です。
- API関数を使用してメモリ、HDD、OSバージョン、CPUなどの情報は取得できていますが、インストール済みのアプリケーション情報の取得方法が分からず困っています。
- レジストリのHKEY_CURRENT_USERのアンインストールの値を読み込む方法について調べましたが、APIに関する知識が不足しているため、解決方法が見つかりません。他の参考ソースや方法があれば教えていただきたいです。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
>APIでレジストリのHKEY_CURRENT_USERのアンインストールの値を読み込めばいいところまでは調べたのですが アプリのインストールはユーザ別ではないので、HKEY_LOCAL_MACHINEですよー 正確には HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall です^^ >API自体、それほど把握していないのでかなり悩みつづけている状態です。。。 以前にインストーラのデバッグ用として、作ったものがあります。 レジストリ操作の関数は advapi32.dll Shlwapi.dll の2種類ありますが、advapi32.dllだけの使用です。 私はあまりShlwapi.dll系は利用しません。バグがあるとかそういうんじゃないけど、DLLに32という数字がついている方が、サンプルを拾い易いからです^^ 16bit版の移植DLLという信頼性もありますしねー それと(当然ですが)「アプリケーションの追加と削除」に出てくるのは、アンインストーラが用意されているものに限りますので、インストーラを介さず、単に解凍して利用しているアプリケーションは対応不可能ですのであしからずデス。 サンプルは下に張っておきますねー 処理としては 1.HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall をキーとして、その中のサブキーを列挙 2.同時に、サブキーと"DisplayName"という項目で、「プログラムの追加と削除」で出てくる表示名を取得 3-1.取得OK:インストール情報を記憶 3-2.取得NG:無処理《3-1と同様、処理は継続する》 4.列挙し終えるまで、1に帰る です 以上 -------------------------------------------------------------------------- Option Explicit Private Type FILETIME dwLowDateTime As Long dwHighDateTime As Long End Type Private Const DEFSTR_UNINSTALL_REG_SUBKEY_PARENT As String = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" Private Const DEFSTR_UNINSTALL_REG_NAME_DISPLAYNAME As String = "DisplayName" Private Const HKEY_CLASSES_ROOT = &H80000000 Private Const HKEY_CURRENT_USER = &H80000001 Private Const HKEY_LOCAL_MACHINE = &H80000002 Private Const HKEY_USERS = &H80000003 Private Const HKEY_PERFORMANCE_DATA = &H80000004 Private Const HKEY_CURRENT_CONFIG = &H80000005 Private Const HKEY_DYN_DATA = &H80000006 Private Const MAX_LEN = 2048 Private Const KEY_QUERY_VALUE = &H1 Private Const KEY_ENUMERATE_SUB_KEYS = &H8 Private Const KEY_NOTIFY = &H10 Private Const SYNCHRONIZE = &H100000 Private Const STANDARD_RIGHTS_READ = &H20000 Private Const KEY_READ = ((STANDARD_RIGHTS_READ Or _ KEY_QUERY_VALUE Or _ KEY_ENUMERATE_SUB_KEYS Or _ KEY_NOTIFY) And (Not SYNCHRONIZE)) Private Const ERROR_SUCCESS As Long = 0& Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long Private Declare Function RegEnumKeyEx Lib "advapi32.dll" Alias "RegEnumKeyExA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpName As String, lpcbName As Long, ByVal lpReserved As Long, ByVal lpClass As String, lpcbClass As Long, lpftLastWriteTime As FILETIME) As Long Private Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long Sub Test() Dim colWk As Collection Dim i As Long If Not GetAppUnInstDisplay(colWk) Then Exit Sub End If For i = 1 To colWk.Count Debug.Print colWk(i) Next i End Sub 'アンインストール情報表示名の取得 Public Function GetAppUnInstDisplay(Optional otCol As Collection) As Boolean Dim lngRet As Long Dim lnghReg As Long Dim lngIndex As Long Dim lngLen As Long Dim strBuffSubKey As String * MAX_LEN Dim FT As FILETIME Dim strSubKey As String Dim strDspName As String '返りコレクション初期化 Set otCol = New Collection 'キーオープン If Not (ERROR_SUCCESS = RegOpenKeyEx(HKEY_LOCAL_MACHINE, DEFSTR_UNINSTALL_REG_SUBKEY_PARENT, 0, KEY_READ, lnghReg)) Then 'キーオープン失敗なので、強制抜け Exit Function End If 'インデックス初期化 lngIndex = 0 Do 'lngIndex個目のサブキーを取得 lngLen = Len(strBuffSubKey) lngRet = RegEnumKeyEx(lnghReg, lngIndex, strBuffSubKey, lngLen, 0, vbNullString, 0, FT) If lngRet = ERROR_SUCCESS Then '値を取得するサブキーの整理 strSubKey = DEFSTR_UNINSTALL_REG_SUBKEY_PARENT & "\" & BuffArrangement(strBuffSubKey) 'アンインストール表示名称の取得 If GetRegValue(HKEY_LOCAL_MACHINE, strSubKey, DEFSTR_UNINSTALL_REG_NAME_DISPLAYNAME, strDspName) Then '取得できたなら、コレクションに追加 otCol.Add strDspName End If 'インデックスを進める lngIndex = lngIndex + 1 End If Loop While lngRet = 0 GetAppUnInstDisplay = True PGMEND: 'キークローズ Call RegCloseKey(lnghReg) End Function 'レジストリ値取得(文字列) Private Function GetRegValue(ByVal inKey As Long, ByVal inSubKey As String, ByVal inName As String, Optional otValue As String) As Boolean Dim lnghReg As Long Dim strBuffValue As String * MAX_LEN Dim lngLen As Long Dim lngType As Long 'キーオープン If Not (ERROR_SUCCESS = RegOpenKeyEx(inKey, inSubKey, 0, KEY_QUERY_VALUE, lnghReg)) Then Exit Function End If 'レジストリ値取得メイン lngLen = Len(strBuffValue) If (ERROR_SUCCESS = RegQueryValueEx(lnghReg, inName, 0, lngType, ByVal strBuffValue, lngLen)) Then otValue = BuffArrangement(strBuffValue) GetRegValue = (otValue <> "") End If 'キークローズ Call RegCloseKey(lnghReg) End Function 'API独特のバッファNULL文字の消去 Function BuffArrangement(ByVal inBuff As String) As String On Error Resume Next BuffArrangement = Left$(inBuff, InStr(1, inBuff, vbNullChar) - 1) End Function
お礼
TAGOSAKU7さん、参考ソースはとっても勉強になります(^^。 色々教えていただいて有難う御座いますm(_ _)m まだまだ勉強不足の身ですが、また何かありましたら 宜しくお願いします。