by イグトランス » 2006年5月29日(月) 20:20
これはRegQueryValueExの使い方がおかしいです。
RegQueryValueExの6番目(最後)の引数はヘルプを見ると書いてありますが、DWordへのポインタ型です。
しかもWindows APIはABの文字列型を知らないので正しく扱えません。
予め自分で受け取るのに必要なだけのメモリを用意してやる必要があります。
そのメモリを用意するのはZeroStringであり,どれだけ用意すれば良いかは
RegQueryValueExの5番目の引数をヌルにすれば6番目の引数を通して得られます。
コード: 全て選択
Const ProductIDRegPath = "SOFTWARE\Microsoft\Internet Explorer\Registration"
Const ProductIDRegName = "ProductId"
Dim ProductId As String
Dim BufSize As DWord
Dim hKey As HKEY
If RegOpenKeyEx(HKEY_LOCAL_MACHINE As HKEY, ProductIDRegPath, 0, KEY_QUERY_VALUE, hKey) = ERROR_SUCCESS Then
If RegQueryValueEx(hKey, ProductIDRegName, 0, 0, 0, VarPtr(BufSize)) = ERROR_SUCCESS Then
ProductId = ZeroString(BufSize)
If RegQueryValueEx(hKey, ProductIDRegName, 0, 0, StrPtr(ProductId), VarPtr(BufSize)) = ERROR_SUCCESS Then
MessageBox(0, StrPtr(ProductId), "", MB_OK)
End If
End If
RegCloseKey(hKey)
End If
たとえばこれならうまく動きます。
これはRegQueryValueExの使い方がおかしいです。
RegQueryValueExの6番目(最後)の引数はヘルプを見ると書いてありますが、DWordへのポインタ型です。
しかもWindows APIはABの文字列型を知らないので正しく扱えません。
予め自分で受け取るのに必要なだけのメモリを用意してやる必要があります。
そのメモリを用意するのはZeroStringであり,どれだけ用意すれば良いかは
RegQueryValueExの5番目の引数をヌルにすれば6番目の引数を通して得られます。
[code]Const ProductIDRegPath = "SOFTWARE\Microsoft\Internet Explorer\Registration"
Const ProductIDRegName = "ProductId"
Dim ProductId As String
Dim BufSize As DWord
Dim hKey As HKEY
If RegOpenKeyEx(HKEY_LOCAL_MACHINE As HKEY, ProductIDRegPath, 0, KEY_QUERY_VALUE, hKey) = ERROR_SUCCESS Then
If RegQueryValueEx(hKey, ProductIDRegName, 0, 0, 0, VarPtr(BufSize)) = ERROR_SUCCESS Then
ProductId = ZeroString(BufSize)
If RegQueryValueEx(hKey, ProductIDRegName, 0, 0, StrPtr(ProductId), VarPtr(BufSize)) = ERROR_SUCCESS Then
MessageBox(0, StrPtr(ProductId), "", MB_OK)
End If
End If
RegCloseKey(hKey)
End If[/code]
たとえばこれならうまく動きます。