• 締切済み

レジストリの読み込み

レジストリの読み込みのソースを教えてください。 例えば、 [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);

  • A__
  • お礼率59% (194/328)

みんなの回答

  • itohh
  • ベストアンサー率45% (210/459)
回答No.1

こんにちは。itohhといいます。 RegOpenKeyEx関数は、ファイルのオープン関数と同じ役目をする関数です。 オープンした後に RegQueryInfoKey関数やRegEnumValue関数、RegQueryMultipleValues関数などで エントリーキーを取得する必要があります。 そして、使い終わったらRegCloseKey関数でクローズ処理を行ってください。 詳しいことはMSDNライブラリーで確認してください。

関連する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);

  • ドロップで起動するけどパスは?

    ファイルをEXEにドロップして起動させます。 ドロップしたファイルのパスを GetCommandLine( ) から 取り出すために、" の位置を調べます。 "EXEのパス" ドロップファイルのパス となっているから、2番目の " の位置を調べました。 でも、for でのループが1回で終わってしまいます。 おかしいところを教えてください。 LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam) {  char *p = GetCommandLine();  char str[200];  switch(msg){  case WM_CREATE:   int i;   for(i = 1; p[i] == '"'; i++);{    wsprintf(str, "%d", p[i]);    MessageBox(hWnd, chStr, "", MB_OK);   }   wsprintf(chStr, "%d", i);   MessageBox(hWnd, str, "", MB_OK); //結果は1   wsprintf(chStr, "%#x", p[0]);   MessageBox(hWnd, str, "1文字目", MB_OK); //結果は34   wsprintf(chStr, "%#x", p[1]);   MessageBox(hWnd, str, "2文字目", MB_OK); //結果は67   wsprintf(chStr, "%#x", p[2]);   MessageBox(hWnd, str, "3文字目", MB_OK); //結果は58

  • レジストリ値の取得

    こんばんは。 レジストリ値の取得について教えてください。 下記のテストコードですが、これだけだと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; }

  • レジストリの値

    どなたかWindows2000を使っておられる方、下のレジストリの値を教えていただけないでしょうか。 HKEY_CLASSES_ROOT→folder→open→command の値です。

  • case で宣言コンパイルエラー

     switch (msg){  case WM_LBUTTONDOWN:   char *p = new char[1000];   wsprintf(p, "%d" , i);   MessageBox(hWnd , p , "" , MB_OK);   delete[] p;  break; がエラーで  switch (msg){  case WM_LBUTTONDOWN:   char *p;   p = new char[1000];   wsprintf(p, "%d" , i);   MessageBox(hWnd , p , "" , MB_OK);   delete[] p;  break; と  switch (msg){  case WM_KEYDOWN:   if( wParam == VK_RETURN ){    char *p = new char[1000];    wsprintf(p, "%d" , i);    MessageBox(hWnd , p , "" , MB_OK);    delete[] p;   }  break; ならエラーじゃなかったんだけど、理由がよく分かりません。 case のすぐ下で宣言と同時に値を代入してはいけないんですか?

  • ログオンスクリプトでレジストリ読み込みできない

    クライアントPCのログオンスクリプトに、以下の.regを読み込むよう記述しました。 ログオンスクリプトはサーバ内にあります。 クライアントをログオンしても、なぜか「HKEY_CLASSES_ROOT」の値を変更してくれません。 「CURRENT_USER」等は.regを読み込んで変更してくれます。 当該行の前後にpauseを入れたり、「CURRENT_USER」配下を変更する.regを配置した場合、 それらは正常に読み込まれるので、スクリプトを通過(動作してる)ことは確かです。 また、ログオン後、.regファイルをクライアントPC上で実行すると 値は変更されます。 「HKEY_CLASSES_ROOT」はログオンスクリプトでは変更できないのでしょうか。 また、正しい記述をご存知であれば、ご教示いただけますでしょうか。 よろしくお願いいたします。 ------------------ MIMEのmp3の関連付けを変更するレジストリです (ログオンスクリプト) REGEDIT /S .regファイルまでのパス (作成した.reg) Windows Registory Editor..... [HKEY_CLASSES_ROOT\MIME\Database\Content Type\audio/mp3] "CLSID"="{文字たくさん}"

  • 宣言による処理の重さ

    第161章 キーボード・フック http://www.kumei.ne.jp/c_lang/sdk2/sdk_161.htm このサイトのLRESULT CALLBACK MyHookProc(int nCode, WPARAM wp, LPARAM lp)で {   char str[256];   if (nCode < 0)     return CallNextHookEx(hMyHook, nCode, wp, lp);   if (wp >= 0x30 && wp <= 0x39) {     wsprintf(str, "hMyHook = %d", hMyHook);     MessageBox(NULL, str, "MyHookProc", MB_OK);     return CallNextHookEx(hMyHook, nCode, wp, lp);   }   wsprintf(str, "キー入力はインターセプトされました\n フックハンドル= %d", hMyHook);   MessageBox(NULL, str, "インターセプト", MB_OK);   return TRUE; } と書いてありますが、char str[256];をstatic char str[256];にしたり、 {   if (nCode < 0)     return CallNextHookEx(hMyHook, nCode, wp, lp);   if (wp >= 0x30 && wp <= 0x39) {     char str[256];     wsprintf(str, "hMyHook = %d", hMyHook);     MessageBox(NULL, str, "MyHookProc", MB_OK);     return CallNextHookEx(hMyHook, nCode, wp, lp);   }   wsprintf(str, "キー入力はインターセプトされました\n フックハンドル= %d", hMyHook);   MessageBox(NULL, str, "インターセプト", MB_OK);   return TRUE; } にするとアプリケーションのパフォーマンスはよくなりますか?

  • 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\"" にすればできるとあるサイトに書いてあったのですが やり方がわかりません。 わかりやすくどなたか教えていただけないでしょうか? よろしくおねがいします

  • MessageBoxでの、書式指定を教えて下さい。

    Windowsで、Visual C++6.0を、使っています。 double max; char szBuf[256]; wsprintf(szBuf,"左 Yの最大値は、%d ",max); MessageBox(hWnd, szBuf, "各最大値", MB_OK); 上記を、実行した時、正しい値を表示してくれません。 デバッガーで見ると、maxには、正しい値、768.55というような値が、入っているようです。 %dを、%fとすると fを表示して値を表示しません。 double型の値を表示させるには、どうしたらいいのでしょうか? 教えて下さい。どうぞよろしくお願いします。

  • wsprintf( ) でポインタに代入

    wsprintf(p, "%d" , i); を書いたせいで、i の値が変わります。 wsprintf(p, "%d" , i); によってどんなことが起こっているのか詳しく知りたいです。 ポインタのことがまだよく分かってないんです。 #include <windows.h> LPCSTR szStr = "\n char c[255];\n char *p = \"\\0\";\n int i = 12345;\n\n switch (msg){\n case WM_LBUTTONDOWN:\n  wsprintf(c, \"%d\" , i);\n  wsprintf(p, \"%d\" , i);\n  MessageBox(hWnd , c , \"\" , MB_OK);\n break;"; LRESULT CALLBACK WndProc(HWND , UINT , WPARAM , LPARAM); int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE , LPSTR , int){ 省略 return msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd , UINT msg , WPARAM wParam , LPARAM lParam){ HDC hDC; PAINTSTRUCT ps; RECT rt; char c[255]; char *p = "\0"; int i = 12345; switch (msg){ case WM_LBUTTONDOWN: wsprintf(c, "%d" , i); wsprintf(p, "%d" , i); MessageBox(hWnd , c , "" , MB_OK); break; case WM_PAINT: GetClientRect(hWnd, &rt); hDC = BeginPaint(hWnd, &ps); DrawText(hDC, szStr, lstrlen(szStr), &rt, DT_WORDBREAK); EndPaint(hWnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); break; default: return(DefWindowProc(hWnd , msg , wParam , lParam)); } return (0L); }