• ベストアンサー

RegQueryValueExについて

Visual Studio C++ .NET 2003でレジストリの値を変更するコンソールアプリケーションを作りたいのですが、 RegQueryValueExで値を読み出すことができません。 下記のようにするとPathLenは正しく読み出せているのですが肝心のPathに何も格納されていないようです。 また4番目の引数はREG_SZが正しいように思えるのですがNULLでないと実行時に "ハンドルされていない例外:System.NullReferenceException:オブジェクト参照がオブジェクト インスタンスに設定されていません" というメッセージが出て途中終了してしまいます。 どなたかよろしくお願い致します。 long lRet; HKEY hkResult; CString Res; char Path[256]; long PathLen=0; //レジストリのハンドルと環境変数のレジストリをリードモードでオープン lRet = RegOpenKeyEx( HKEY_USERS, "S-1-5-21-842925246-1563985344-1957994488-500\\Environment", 0, KEY_ALL_ACCESS, &hkResult ); if(lRet == ERROR_SUCCESS) { //現在のパスを読み込む PathLen = strlen(Path); RegQueryValueEx( hkResult, "NEWVALUE", NULL, /*(LPDWORD)REG_SZ,*/NULL, (LPBYTE)Path, (LPDWORD)&PathLen ); } printf("%s\n", Path);printf("%ld\n", PathLen); //ハンドルをクローズ RegCloseKey(hkResult); インデントができなかったので見づらくてすみません。

質問者が選んだベストアンサー

  • ベストアンサー
  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.1

>PathLen = strlen(Path); のところで、PathLenは0になってるんじゃないですか? たぶん・・・。

Soldier
質問者

お礼

全くその通りでした。 実は質問した後で気づいたのでしまったと思っていたのですが・・・。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

1. 失敗したときの戻り値は? 2. KEY_ALL_ACCESSにしないといけませんか? 3. 実行しているユーザに管理者権限ありますか? http://www.microsoft.com/japan/developer/library/jpwinpf/_win32_regopenkeyex.htm

参考URL:
http://www.microsoft.com/japan/developer/library/jpwinpf/_win32_regopenkeyex.htm
Soldier
質問者

お礼

質問した後、戻り値を調べてみたところ 234 MORE_DATAなんとかだったので下のように間違いに気づきました。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • レジストリ値の取得

    こんばんは。 レジストリ値の取得について教えてください。 下記のテストコードですが、これだけだとOKなのですが、いざ実際に使おうと他のソースに入れ込むと、一番最初(WinMain直後)に持ってきたとしても、「アプリケーションエラー」になってしまいます。 恐らくメモリの確保ができてないのかと思うのですがどうしたらよいのでしょうか? 環境は OS: Windows 2000 Professional C: Borland C++ Compiler です。 -- #include <windows.h> int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { HKEY hKey; LPBYTE lpData; LPDWORD lpcbData; lpData = (LPBYTE)malloc(256); RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Setup", 0, KEY_QUERY_VALUE, &hKey); RegQueryValueEx(hKey, "BootDir", NULL, NULL, NULL, lpcbData); RegQueryValueEx(hKey, "BootDir", NULL, NULL, lpData, lpcbData); RegCloseKey(hKey); MessageBox(NULL, lpData, "lpData", MB_OK); return 0; }

  • UTF_16で取得しUTF_8で出力したい!!

    こんにちは。 C言語初心者です。以前この件で質問させていただいたのですがエラーがとれず、もう一度質問してしまいました。 今回は、C言語でレジストリからデータをUTF_16で取得し、UTF_8で表示すると言うプログラミングを組みたいのですがどうしても下記のコードではエラーが出てしまいどうしていいかわかりません。 エラーの内容としては、16から8に変換する部分のutf8Sizeの部分で上手くいっていないようで、、、 どうしたらいいかわからないので、もし知っている方がいればよろしくお願いします。 #include<windows.h> #include<stdio.h> void QueryValue(void); int main(void){    QueryValue();    return 0; } void QueryValue(void){    HKEY hkey;    DWORD ValueType;    DWORD ValueSize;    wchar_t Value[1000];    char *utf8String = 0; // UTF-8 文字列バッファへのポインタ    size_t utf8Size = 0; // UTF-8 文字列のバイト数 (終端 NUL 含む) int result; // WideCharToMultiByte() の戻り値    /*レジストリキーのオープン*/    RegOpenKeyEx(      HKEY_LOCAL_MACHINE,         L"SOFTWARE\\Hitachi\\JP1/RemoteControlManager",      0,      KEY_ALL_ACCESS,      &hkey);     ValueSize = 1000;   /*レジストリ値の取得*/    RegQueryValueEx(      hkey,      L"ProgramName",      NULL,      &ValueType,      (LPBYTE)Value,      &ValueSize);    /*結果の表示(シフトJIS変換’%S’)*/    if(ValueType == REG_SZ) printf("%S\n",Value);    else printf("....can't read\n"); /*****************************************************/    //UTF_16からUTF_8変換を行う    result = WideCharToMultiByte(      CP_UTF8,      WC_NO_BEST_FIT_CHARS,      Value,      -1,      utf8String,      utf8Size,      NULL,      NULL);    if(result <= 0){      fprintf(stderr,"UTF_16→UTF_8変換エラー(%lu)\n",GetLastError());    }    /*結果の表示()*/    if(ValueType == REG_SZ) printf("%s\n",utf8String);    else printf("....can't read\n");    /*UTF_8文字列バッファを開放する*/    free(utf8String); /************************************************/    /*終了*/    RegCloseKey(hkey); }

  • RegQueryValueExでの2バイト文字

    RegQueryValueExを使ってレジストリキーから値をとってきたいのですが、そのキー(REG_SZ)にはファイルパスが記載されており、そのキーを取得するときに2バイト文字(日本語のフォルダ名)があるとそこでデータが切れてしまって取得してしまいます。 c:\test\テスト\aaa.dll とあるとテスト直前のc:\test\しか取得できません。以下の例ではEntryのキーに上記dllパスが記載されてます。 char data[256]; DWORD dwSize; DWORD dwSize; RegQueryValueEx(hKey,(LPCTSTR)Entry,NULL,&dwType,NULL,&dwSize); RegQueryValueEx(hKey,(LPCTSTR)Entry,NULL,&dwType,(LPBYTE)data,&dwSize); 2バイト文字がないと正しく取得できます。 どのように実装すればよいでしょうか?

  • レジストリ経由のフォント受渡し???

    数日前に類似の質問をさせて頂きました ご親切に3件もご指導の回答を頂きましたが、私の質問の仕方が悪く問題の解決に至っておりません 再度、質問形式を変更してお教えを請いたいと存じます C#のアプリケーションでフォントダイアログを表示してフォントを指定します 指定されたものをレジストリに書込みます FontDialog MyFont = new FontDialog(); if (MyFont.ShowDialog() != DialogResult.Cancel) { key = Registry.CurrentUser; key = key.CreateSubKey(@"MyCompany\MySoft"); key.SetValue("MyKey", MyFont.Font, Microsoft.Win32.RegistryValueKind.Unknown); ← (1) } レジストリの HKEY_CURRENT_USER ⇒ SoftWare ⇒ MyCompany ⇒ MySoft の下の MyKeyには REG_SZ 種類でデータとして [Font: Name=HPG行書体, Size=15.75, Units=3, GdiCharSet=128, GdiVericalFont=False] ← (2) と設定されました これをC++プログラムで読み込み、フォントダイアログで指定されたフォントで印刷します HKEY hKey; DWORD dwDisposition; LONG result; result = RegCreateKeyEx( HKEY_CURRENT_USER,L"MyCompany\\MySoft",0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hKey,&dwDisposition); HFONT MyHFONT;  ← (3) result = RegQueryValueEx(hKey,L"MyKey",NULL,&dwType,NULL,&dwSize); //データのサイズを取得 result = RegQueryValueEx(hKey,L"MyKey",NULL,&dwType,(LPBYTE)(LPCTSTR)&MYHFONT,&dwSize); ← (4) SelectObject(hdc,MYHFONT); TextOutW (hdc, ~~  ← (5) 質問 (1) フォント指定をレジストリに書込む時、Unknown指定で良いのでしょうか  (2) Unknow指定で書込みましたがREG_SZ種別になっています OKですか それから書き込まれたデータはこれで正常ですか (3) HFONTを指定していますが、この場合OKですか (4) (LPBYTE)(LPCTSTR)&MYHFONTで受けていますが良いのでしょうか? (5) 最大のワカラナイ!!! 印刷された文字はC#のフォントダイアログでしていされたものに変化していない 以前のままです C++は初心者です 特にフォントのハンドリング知識は浅学です 宜しくご指導お願い申し上げます

  • (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 どこが悪いか教えてください お願いします

  • レジストリの値の取得のデータ型について…

    いつも大変お世話になっています。 今回は、APIのRegQueryValueExを使用してレジストリの値を取得しようとしているのですが、 レジストリのデータ型に対応するVBのデータ型がわからないものがあったので 質問させていただきます。 REG_EXPAND_SZ 展開可能フィールド(%USERNAME% %SystemRoot%など)を含んだ文字列 REG_MULTI_SZ 連続したゼロで終わる文字列(Str1\0Str2\0Str3\0... REG_BINARY バイナリデータ (最大1Mバイト) の3つなんですが、REG_BINARYはByte型でもエラーは出なかったのですが、値がレジストリのものと 違いました。(レジストリ:00 00 01 00 のデータに対して 取得データ:0 が取得されたのです) 他の2つは文字列型、数値型、バリアント型で試しましたが、すべて、メモリの参照エラーになってしまうのです。 どうかよろしくお願いします。

  • textファイルの関連付け:Excel内リンクから

    テキストファイルを秀丸エディタに関連づけています。テキストファイルのクリックでは正常に秀丸から開かれます。ところがなぜか、Excelのファイルのハイパーリンクからテキストファイルを開こうとすると、秀丸ではなくnotepadで開かれてしまいます。おそらくレジストリの問題でしょうが、どこを変更したらいいのかわかりません。現在の値は次の通りです。よろしくお願いします。 HKEY_CLASSES_ROOT .txt (既定)  REG_SZ textfile Content Type REG_SZ text/plain Perceived Type REG_SZ text ShellNew (既定)  REG_SZ ItemName ~~~~\Hidemaru.exe NullFile  REG_SZ

  • Windows コンポーネントをインストールしたいNO.2

    あれから大変困っています。 よろしくお願いします。 やはり、http://www.atmarkit.co.jp/fpc/pctips/005autoaddnt2k/autoaddnt2k.html のページに乗っていたレジストリを自分のパソコンでもやってみました。 しかし、何も、変わらず、インストールCDを要求されてしまいます。 レジストリは、このようになっています。 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Setup\ 値のデータ REG_SZ SourcePath→E:\→C:\WINDOWS に変更しました。 ================================================================ HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\ 値のデータ REG_SZ SourcePath→E:\I386→C:\WINDOWS\I386 にしました。 しかし、それでも、CDの要求を続けてしまいます。 レジストリを変更しても、聞いてくれません。 I386フォルダも、C:\WINDOWSにあるのに、なぜでしょうか? どなたか、お詳しい方、教えていただければ.....と思っています。 よろしくお願いします。

  • ログオフからの自動ログオンができません

    どなたか教えて下さい。 Windows2000Serverにて、MicrosoftのHPで掲載されていたレジストリ変更による自動ログオンの設定を行ったところ、正常に自動ログオンされず、ログオンウィンドウが表示されてしまいます。 <<変更個所>> HKEY_LOCAL_MACHINE\OFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon 値の名前 データタイプ AutoAdminLogon REG_SZ DefaultDomainName REG_SZ DefaultUserName REG_SZ DefaultPassword REG_SZ その後いろいろと試してみたところ、AltDefaultUserNameという値にユーザー名をセットすることで、シャットダウンからのログオンを自動で行うことはできたのですが、ログオフによるログオンがどうしてもできませんでした。 Windows2000では、シャットダウンからのログオンとログオフからのログオンとでは動作が異なるのでしょうか? どなたかご教授ください。。

  • batのreg exportで改行を入れる方法

    batのreg exportを使ってレジストリの一部をエクスポートしたいと考えています REG EXPORT "HKEY_CURRENT_USER\Software\Vision Thing\PSEmu Pro" "ePSXe設定.reg" とすると、うまくいくのですが REG EXPORT ^ "HKEY_CURRENT_USER\Software\Vision Thing\PSEmu Pro" ^ "ePSXe設定.reg" とすると、なぜか「^」というファイル名で出力されてしまいます。 ""はパスの中にスペースが入っていると必須なのですが REG EXPORT ^ HKEY_CURRENT_USER\Software ^ "ePSXe設定.reg" のようにして""を外してやるとうまくいきます。 どうも""と^を同時に使うとうまくいかないようです。 どうすれば同時に使えますでしょうか?

専門家に質問してみよう