| Windows のプロダクトIDを取得するユーザー定義関数 |
|
対象バージョン : 97, 2000, 2002, 2003
最終更新日 : 2005/04/25
(オリジナル作成日:1998/09/01)
概 要
コントロールパネルのシステムで表示される Windows のプロダクトIDがレジストリに記録されていますので、これを取得するユーザー定義関数です。
解 説
General - Declarations
Public Const HKEY_LOCAL_MACHINE = &H80000002
Public Const REG_SZ = 1&
Public Const SYNCHRONIZE = &H100000
Public Const READ_CONTROL = &H20000
Public Const STANDARD_RIGHTS_READ = (READ_CONTROL)
Public Const KEY_QUERY_VALUE = &H1
Public Const KEY_ENUMERATE_SUB_KEYS = &H8
Public Const KEY_NOTIFY = &H10
Public Const KEY_READ = ((STANDARD_RIGHTS_READ Or KEY_QUERY_VALUE Or _
KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY) And (Not SYNCHRONIZE))
Public Const VER_PLATFORM_WIN32_NT = 2
Declare Function RegOpenKeyEx Lib "advapi32" Alias "RegOpenKeyExA" _
(ByVal hkeyRoot As Long, ByVal lpszSubKey As String, ByVal ulOptions As Long, _
ByVal samDesired As Long, phkeyResult As Long) As Long
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
Declare Function RegCloseKey Lib "advapi32" (ByVal hkey As Long) As Long
Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" _
(lpVersionInformation As OSVERSIONINFO) As Long
Type OSVERSIONINFO
dwOSVersionInfoSize As Long
dwMajorVersion As Long
dwMinorVersion As Long
dwBuildNumber As Long
dwPlatformId As Long
szCSDVersion As String * 128
End Type
Function プロシージャ
Function GetWinProductId() As String
Dim stSubKey As String
Dim stProductid As String * 255
Dim hkeyRoot As Long
Dim lErr As Long
Dim OSVER As OSVERSIONINFO
OSVER.dwOSVersionInfoSize = Len(OSVER)
lErr = GetVersionEx(OSVER)
If lErr = 0 Then Exit Function
If OSVER.dwPlatformId = VER_PLATFORM_WIN32_NT Then
stSubKey = "SOFTWARE\Microsoft\Windows NT\CurrentVersion"
Else
stSubKey = "SOFTWARE\Microsoft\Windows\CurrentVersion"
End If
lErr = RegOpenKeyEx(HKEY_LOCAL_MACHINE, stSubKey, 0&, KEY_READ, hkeyRoot)
If lErr <> 0 Then Exit Function
lErr = RegQueryValueEx(hkeyRoot, "ProductId", 0&, REG_SZ, ByVal stProductid, 255)
lErr = RegCloseKey(hkeyRoot)
If lErr <> 0 Then Exit Function
'
' 97 まではこれで動作可(これは以前の掲載内容)
' GetWinProductId = Left(stProductid, InStr(stProductid, vbNullChar))
'
' 2000 では、以下のようにしないと実行時エラーが発生することがあります。97 でも動作します。
GetWinProductId = Left(stProductid, InStr(1, stProductid, vbNullChar, vbBinaryCompare))
End Function
補 足
改訂履歴