• 締切済み

RegQueryValueExでエントリ名にNullを指定するとエラー

拡張子から、登録されているアプリケーションを探すために、レジストリを見ようとしています。 \HKEY_CLASSES_ROOT\<.拡張子> の中の、(標準)エントリの値を探し、 \HKEY_CLASSES_ROOT\探した名前\shell\open\command の中の、(標準)エントリで目的とするアプリケーションを見つけられるところまでは判ったのですが、 この最初のエントリ値を求めるところでつまづいています。 下記のような処理で、RegQueryValueExのところで必ずアプリケーションエラーが出てしまいます。 Dim tmpRet As Long Dim tmpKey As Long Dim tmpBuf As String Dim tmpBufLen As Long tmpRet = RegOpenKeyEx(HKEY_CLASSES_ROOT, ".txt", 0&, KEY_ALL_ACCESS, tmpKey) tmpBuf = String$(256, " ") tmpBufLen = 256 tmpRet = RegQueryValueEx(tmpKey, vbNullString, 0&, 0&, tmpBuf, tmpBufLen) tmpBuf = Left$(tmpBuf, tmpBufLen - 1) MsgBox ("データ値:" & tmpBuf)

みんなの回答

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

最初のオープンした所と探すキーの場所が違うような気がします。 WScript.Shellオブジェクトを使うともっと手軽にできます。 例 Dim WshShell, exp, aKey, fkind, soft Set WshShell = CreateObject("WScript.Shell") exp=".txt" aKey= "HKEY_CLASSES_ROOT\" & exp & "\" fkind = WshShell.RegRead(aKey) aKey= "HKEY_CLASSES_ROOT\" & fkind & "\shell\open\command\" soft = WshShell.RegRead(aKey) MsgBox "データ値:" & soft

sakitag1
質問者

お礼

ありがとうございます。 エラーの原因はわからずじまいですが、 WScript.Shellを使うやりかたで無事、実行ファイルを取得することができました。

関連するQ&A

  • HKEY_CLASSES_ROOT\.avi

    [HKEY_CLASSES_ROOT\.avi] @="avifile" "Content Type"="video/x-msvideo" の2つの値をメッセージボックスに表示するソースを教えてください。 HKEY hKey; RegOpenKeyEx(HKEY_CLASSES_ROOT, ".avi", 0, KEY_READ, &hKey); wsprintf(str1, "%", ); MessageBox(hWnd, str1, "標準の値", MB_OK); wsprintf(str2, "%", ); MessageBox(hWnd, str2, "コンテンツタイプの値", MB_OK); RegCloseKey(hKey);

  • レジストリの読み込み

    レジストリの読み込みのソースを教えてください。 例えば、 [HKEY_CLASSES_ROOT\.avi] @="avifile" "Content Type"="video/x-msvideo" の2つの値をメッセージボックスに表示するソースを教えてください。 HKEY hKey; RegOpenKeyEx(HKEY_CLASSES_ROOT, ".avi", 0, KEY_READ, &hKey); wsprintf(str1, "%", ); MessageBox(hWnd, str1, "標準の値", MB_OK); wsprintf(str2, "%", ); MessageBox(hWnd, str2, "コンテンツタイプの値", MB_OK); RegCloseKey(hKey);

  • (VBA)RegDeleteKeyがエラー

    RegDeleteKeyについて教えてください ○削除するレジストリHKEY_LOCAL_MACHINE\SOFTWARE\XTSEGRSCESK\AAA ○ソース Public Const HKEY_LOCAL_MACHINE = &H80000002 Dim lRootKey As Long Dim sSubKey As String Dim lRet As Long lRootKey = HKEY_LOCAL_MACHINE sSubKey = "SOFTWARE\XTSEGRSCESK\AAA" lRet = RegDeleteKey(lRootKey, sSubKey) ○結果 RegDeleteKeyの戻り値が2 どこが悪いか教えてください お願いします

  • VBからExcelのテキストを指定して開きたい

     VBのアプリケーションから文書名を指定してエクセルを起動したいのですが 出来なくて困っています。ちなみにコードは下記のとおりです。どこに問題があ るのか教えていただけないでしょうか。 Private Sub Command1_Click() Dim lngReturnCode As Long Dim strFileName As String strFileName = "AllTitles.csv"   lngReturnCode = ShellExecute(Me.hwnd, _ "open c:\***\***.xls", _ strFileName, _ vbNullString, _ App.Path, _ SW_SHOWNORMAL) End Sub

  • WindowsのプロダクトIDを取得する方法について

    WindowsのプロダクトIDを取得する方法について Active Basic 4.24.00を使用してプログラムを書いています。 (AB5はバグがあるためまだ使用していません。) http://www.ruriplus.com/msaccess/tch/tch_036.html 上記のサイト様を参考に、WindowsのProduct IDを取得しようとしています。 (参考というより、コピペなのですが・・・) しかし、きちんと取得してくれません。 AB用に以下のように書き直しました。 Function GetWinProductId() As String Dim stSubKey As String Dim stProductid As String Dim hkeyRoot As HKEY Dim lErr As Long Dim OSVER As OSVERSIONINFO Dim dummy As Long stProductid=ZeroString(256) 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 MessageBox(0,"ERROR","1",0) Exit Function End If lErr = RegQueryValueEx(hkeyRoot, "ProductId", &0, REG_SZ,stProductid, 256) If lErr <> 0 Then MessageBox(0,"ERROR","2",0) Exit Function End If lErr = RegCloseKey(hkeyRoot) If lErr <> 0 Then MessageBox(0,"ERROR","3",0) Exit Function End If GetWinProductId = Left$(stProductid, 255 /*InStr(1, stProductid, vbNullChar, vbBinaryCompare)*/) End Function MessageBox(0,GetWinProductId(),0,0) ※ Left$(stProductid, 255 /*InStr(1, stProductid, vbNullChar, vbBinaryCompare)*/) この部分は、よく分からなかったので、とりあえず放置しています。 その前に、変数『stProductid』に値が帰ってこないのです。 (RegQueryValueExでエラーが返る。FormatMessageでエラーを見ると、正常終了している。・・・が、0以外の値が返ってくる) すいませんが、ご存知の方、やり方をご教示ください。 お願いします。

  • エクセルVBAでのエラー

    おはようございます。 昨日ここでいろいろ教えていただき、300のエクセルファイルから特定の範囲のデータ抽出方法を書いてみたのですが、セルが多すぎて実行できません、というエラーがでてしまいます。 これはどのように解消すればよろしいのでしょうか? Sub Test() Dim FPath1 As String, FPath2 As String Dim FName As String, myBook As String Const startROW As Long = 14, lastROW As Long = 20 Const startCOL As Long = 8, lastCOL As Long = 10 Const shtNAME As String = "sheet1" Application.ScreenUpdating = False FPath1 = "D:\MR5567\" FPath2 = "D:\New Microsoft Excel Worksheet\" Workbooks.Add myBook = ActiveWorkbook.Name FName = Dir$(FPath1 & "*.xls") Do While FName <> "" Workbooks.Open Filename:=FPath1 & FName ActiveWorkbook.Sheets.Select Sheets(1).Activate Sheets.Copy After:=Workbooks(myBook).Sheets(Sheets.Count) Workbooks(FName).Activate Application.DisplayAlerts = False ActiveWorkbook.Close FName = Dir$ Loop ActiveWorkbook.SaveAs Filename:=FPath2 & "Renketsu.xls", FileFormat:=xlNormal ActiveWorkbook.Close Application.ScreenUpdating = True End Sub

  • 現在ファイルを開いている全てのユーザー名を取得

    パソコン1に入っているアクセスファイル(accdb)に パソコン1とパソコン2で同時に開いています。 共有している状態です。 その際、現在ファイルを開いている全てのユーザー名を取得したいのですが http://okwave.jp/qa/q3589812.html を参考に ' // 標準モジュール Private Declare Function GetUserName Lib "ADVAPI32.dll" Alias "GetUserNameA" ( _     ByVal lpBuffer As String, _     ByRef nSize As Long _ ) As Long Private Const MAX_PATH As Long = 256 ' // Windows のログインユーザー名を取得する Public Function GetLoginUserName() As String   Dim sBuffer As String   sBuffer = String$(MAX_PATH, vbNullChar)   If CBool(GetUserName(sBuffer, MAX_PATH) > 0) Then     GetLoginUserName = Left$(sBuffer, InStr(sBuffer, vbNullChar) - 1)   End If End Function Sub 使い方サンプル()   Dim sUserName As String      sUserName = GetLoginUserName()   MsgBox "USER: " & sUserName, vbInformation    End Sub を実行してみたのですが、それぞれ自分のユーザー名しか取得されません。 http://billyboy.blog81.fc2.com/blog-entry-157.html の Public Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" _ (ByVal lpBuffer As String, _ nSize As Long) As Long Function GetLoginName() Dim strBuffer As String * 255, retValue As Long retValue = GetUserName(strBuffer, 255) GetLoginName = Left(strBuffer, InStr(strBuffer, vbNullChar) - 1) End Function Sub sample() MsgBox GetLoginName() End Sub を実行しても同じです。 http://www.tsware.jp/tips/tips_013.htm も自分のユーザー名しか取得できません。 どれも標準モジュールに貼り付けました。 現在ファイルを開いているユーザー名を取得するにはどうすればいいでしょうか?

  • vc++のAPI(dll)の引数をVBAでうけとる

    Excelで開発しなければならない事情があり、 vc++のAPIが持っている関数を ExcelVBAでコールしておりますが、エラー1041でExcelが強制終了してしまいます。 VBAからVisual C++にchar*型で渡し、ByRef String型でVBAにて受け取ります。 VCの関数の第四引数「char* 型/attribute_value」をVBAの「String 型/sValue」で受け取る際にエラーになっているようです。 VBAでcharに相当する変数型がないためと思われますが、何かよいアイデアがありましたらご教授願います。 --VC-- XDW_GetDocumentAttributeByName(h, attribute_name, &attribute_type, attribute_value, size, NULL); --VBA-- <宣言部> Public Declare Function XDW_GetDocumentAttributeByName Lib "C:\Users\○○○\Desktop\dwsdk710jpn\XDWAPI\DLL\xdwapi.dll" (ByVal lnghandle As Long, ByVal sName As String, ByRef lngType As Long, ByRef sValue As String, ByVal lngSize As Long, ByVal reserved As String) As Long <呼び出し部> Dim lngHandle As Long Dim sName as String Dim lngType As Long Dim sValue As String Dim lngSize as Long Dim tmpSize as Long lngSize = 0 sName = "keiyaku" tmpSize = XDW_GetDocumentAttributeByName(lngHandle, sName, sType, sValue, lngSize, vbNullString) XDW_GetDocumentAttributeByName lngHandle, sName, sType, vbNullString, tmpSize, vbNullString degug.print sValue

  • sleipnirでmsnメッセンジャーを開く

    sleipnirでmsnメッセンジャーを開きたいのですが なにか良い方法はありますでしょうか? ちなみに MSN MessengerがURLを開くブラウザを決定する挙動が、大体つかめた気がするので、手順を書いてみようかと。かなりアクロバットなレジストリの参照の仕方をしているなぁという感想。普通にhttpの関連付けから起動とかで良いじゃん。 MSN MessengerはURLを開く時、以下のような感じでレジストリを参照してました。 HKEY_CLASSES_ROOT\.htmの標準の値を読む htmlfileだった場合 IE強制(多分) htmlfileでない場合 HKEY_CURRENT_USER\httpをチェック(普通は無い) HKEY_CLASSES_ROOT\httpをチェック(普通はある) HKEY_CLASSES_ROOT\httpの関連付けに従ってURLを開く というわけで、やることは、 HKEY_CLASSES_ROOT\htm.dummyなどダミーのキーを作る HKEY_CLASSES_ROOT\.htmの標準の値を上記のキー名にする HKEY_CLASSES_ROOT\httpの関連付けを起動したいブラウザにする ということになります。これでMSN Messengerから任意のブラウザを起動することができるはずです。 こんな感じのレジストリファイルを作成し、ダブル・クリックしてやれば良いはず。 REGEDIT4 [HKEY_CLASSES_ROOT\htm.dummy] [HKEY_CLASSES_ROOT\.htm] @="htm.dummy" [HKEY_CLASSES_ROOT\http\shell] @="Moon" [HKEY_CLASSES_ROOT\http\shell\Moon] @="Moon" [HKEY_CLASSES_ROOT\http\shell\Moon\command] @="\"C:\\Program Files\\Moon Browser\\mb.exe\" \"%1\"" にすればできるとあるサイトに書いてあったのですが やり方がわかりません。 わかりやすくどなたか教えていただけないでしょうか? よろしくおねがいします

  • アクセスでテキストを開く

    アクセスでパスを指定して、特定のテキストファイルを開く方法を教えていただけますか? いかのモジュールを見つけたのですが、どこに、動かないか… フルパスを入れればよいか分かりません。 どうぞ宜しくお願いします。 *********************************************************************************************** Private Declare Function ShellExecute Lib "SHELL32.DLL" Alias "ShellExecuteA" (ByVal hwnd As Long, _ ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, _ ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long Private Sub コマンド0_Click() Dim strFilePath As String Dim lngRet As Long Const SW_SHOWNORMAL = 1 strFilePath = Me.txt_Path 'WinAPIを使って関連付けられたアプリケーションを起動 lngRet = ShellExecute(Application.hWndAccessApp, "OPEN", _ strFilePath, vbNullString, CurDir(), SW_SHOWNORMAL) If lngRet <= 32 Then '返り値が 32 以下の場合はエラー MsgBox "ファイルを開けません!", vbOKOnly + vbExclamation End If End Sub ***********************************************************************************************

専門家に質問してみよう