2016-07-01 45 views
-1

レジストリのアンインストールフォルダを、指定したプログラムに対して検索しようとしていますが、regeditをチェックしています。私の関数は現在、プログラムを検索しますが、何らかの理由で、次の反復までRegGetValue関数の出力値を更新しません。したがって、正しいレジストリキーとその前身を出力します。何か案は?C++ RegGetValue関数の出力エラー

私は、Visual Studio 2015を使用するIntelプロセッサ搭載のWindows 10 64ビットワークステーションを使用しています。

main.cppに

#include "Registry.h" 
#include <Windows.h> 
#include <tchar.h> 

void main() 
{ 
    Registry test(_T("Microsoft SQL Server 2012 Native Client ")); 
} 

Registry.h

#pragma once 

#include <Windows.h> 
#include <string> 

#define REG_PATH L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\" 
#define X86REG_PATH L"SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\" 

class Registry 
{ 
public: 
    Registry(TCHAR* name); 
    ~Registry(); 
    TCHAR* findGUID(); 
    TCHAR* getDisplayName(); 
    TCHAR* getGUID(); 
    TCHAR* getVersion(); 
    TCHAR* getPublisher(); 
    TCHAR* getInstallDate(); 
private: 
    TCHAR* displayName; 
    TCHAR* guid; 
    TCHAR* version; 
    TCHAR* publisher; 
    TCHAR* installDate; 
}; 

Registry.cpp

#pragma once 

#include "Registry.h" 
#include <Windows.h> 
#include <iostream> 
#include <tchar.h> 
#include <fstream> 

Registry::Registry(TCHAR* name) 
{ 
    HKEY hKey; 
    LPCTSTR lpSubKey; 
    DWORD ulOptions; 
    REGSAM samDesired; 

    if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, REG_PATH, NULL, KEY_READ, &hKey) == ERROR_SUCCESS) 
    { 
     std::wofstream file; 
     file.open("test.txt"); 
     int index = 0; 
     HKEY UninstallDir = hKey; 
     TCHAR subKey[MAX_PATH]; 
     DWORD subKeySize = MAX_PATH; 
     while (RegEnumKeyEx(hKey, index, subKey, &subKeySize, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) 
     { 
      HKEY guid; 
      TCHAR* guidPath = new TCHAR[MAX_PATH]; 
      _tcscpy_s(guidPath, MAX_PATH, REG_PATH); 
      _tcscat_s(guidPath, MAX_PATH, subKey); 
      TCHAR compareName[MAX_PATH]; 
      DWORD nameSize; 
      //print all registry keys to file 
      file << index << ": " << guidPath << std::endl; 
      int test; 
      RegGetValue(HKEY_LOCAL_MACHINE, guidPath, _T("DisplayName"), RRF_RT_ANY, NULL, &compareName, &nameSize); 
      //compare all registry keys *temporary to debug 
      if (_tcscmp(guidPath, _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{49D665A2-4C2A-476E-9AB8-FCC425F526FC}")) == 0) 
      { 
       std::wcout << guidPath << " found" << std::endl; 
      } 
      if (_tcscmp(compareName, name) == 0) 
      { 
       _tprintf(_T("%d: %s\n"), index, guidPath); 
      } 
      //print if found 

      index++; 
      subKeySize = 260; 
     } 
     file.close(); 
    } 
    else 
    { 
     std::cout << "Could not open registry key." << std::endl; 
    } 
    //temporary to see console 
    std::cin.get(); 
} 
//still need to be completed 
Registry::~Registry() 
{ 
} 

TCHAR* Registry::findGUID() 
{ 
    return _T(""); 
} 

TCHAR* Registry::getDisplayName() 
{ 
    return _T(""); 
} 

TCHAR* Registry::getGUID() 
{ 
    return _T(""); 
} 

TCHAR* Registry::getVersion() 
{ 
    return _T(""); 
} 

TCHAR* Registry::getPublisher() 
{ 
    return _T(""); 
} 

TCHAR* Registry::getInstallDate() 
{ 
    return _T(""); 
} 
+0

'ファイル<<インデックス<< ":"<

+0

パスを漏らさずにデバッグするにはどうすればよいですか? –

+0

あなたは 'new []'で割り当てたものを '[]'削除する必要があります。それ以外の場合は、代わりに 'std :: vector'または' std :: basic_string'を使用してください。また、 '_printf()'の代わりに 'std :: wcout'を使うべきです。また、 'X86REG_PATH'を使用しないでください。代わりに' RRF_SUBKEY_WOW6432KEY'フラグを使用してください。 –

答えて

2

私はと多くの問題を参照してくださいあなたのコード。

std::wcout_tprintf()が混在しているため、バッファリングの競合が発生します。

charwchar_tのデータが正しく混合されていません。

ループの繰り返しごとにguidPathがリークしています。

RegGetValue()を呼び出すときにnameSizeを初期化していません。

32ビットWow64Nodeキーに正しくアクセスするようにコードを設定していません。

代わりにこのようなものを試してみてください。

main.cppに

#include <Windows.h> 
#include "Registry.h" 

void main() 
{ 
    Registry test(L"Microsoft SQL Server 2012 Native Client"); 
} 

Registry.h

#pragma once 

#include <Windows.h> 
#include <string> 

class Registry 
{ 
public: 
    Registry(const std::wstring &name); 
    ~Registry(); 
    std::wstring findGUID(); 
    std::wstring getDisplayName(); 
    std::wstring getGUID(); 
    std::wstring getVersion(); 
    std::wstring getPublisher(); 
    std::wstring getInstallDate(); 
private: 
    std::wstring displayName; 
    std::wstring guid; 
    std::wstring version; 
    std::wstring publisher; 
    std::wstring installDate; 
}; 

Registry.cpp

#pragma once 

#include <Windows.h> 
#include "Registry.h" 
#include <iostream> 
#include <fstream> 

#define REG_PATH L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\" 

Registry::Registry(const std::wstring &name) 
{ 
    HKEY hKey; 

    // If you want to open the 32bit Wow64Node key, 
    // DO NOT open the key directly! Open the 64bit 
    // key and include the KEY_WOW64_32KEY flag 
    // so it will redirect to the Wow64Node key... 
    if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, REG_PATH, NULL, KEY_READ, &hKey) == ERROR_SUCCESS) 
    { 
     std::wofstream file; 
     file.open(L"test.txt"); 

     WCHAR subKey[MAX_PATH]; 
     DWORD subKeySize = MAX_PATH; 
     WCHAR compareName[MAX_PATH]; 
     DWORD nameSize; 
     int index = 0; 

     while (RegEnumKeyEx(hKey, index, subKey, &subKeySize, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) 
     { 
      // print all registry keys to file 
      file << index << L": " << REG_PATH << subKey << std::endl; 
      int test; 
      nameSize = sizeof(compareName); 
      RegGetValue(hKey, NULL, L"DisplayName", RRF_RT_REG_SZ | RRF_RT_REG_EXPAND_SZ | RRF_ZEROONFAILURE, NULL, compareName, &nameSize); 
      //compare all registry keys *temporary to debug 
      if (wcscmp(subKey, L"{49D665A2-4C2A-476E-9AB8-FCC425F526FC}") == 0) 
      { 
       std::wcout << subKey << L" found" << std::endl; 
      } 
      if (name == compareName) 
      { 
       std::wcout << name << L" found" << std::endl; 
      } 
      //print if found 

      index++; 
      subKeySize = MAX_PATH; 
     } 
     file.close(); 
    } 
    else 
    { 
     std::wcout << L"Could not open registry key." << std::endl; 
    } 

    //temporary to see console 
    std::wcin.get(); 
} 

//still need to be completed 
Registry::~Registry() 
{ 
} 

std::wstring Registry::findGUID() 
{ 
    return L""; 
} 

std::wstring Registry::getDisplayName() 
{ 
    return L""; 
} 

std::wstring Registry::getGUID() 
{ 
    return L""; 
} 

std::wstring Registry::getVersion() 
{ 
    return L""; 
} 

std::wstring Registry::getPublisher() 
{ 
    return L""; 
} 

std::wstring Registry::getInstallDate() 
{ 
    return L""; 
} 
+0

よろしいですか?明日は仕事でお試しになります。あなたが読むことをお勧めする良い文書はありますか?私はウィンドウを定義したタイプの経験がなく、学習目的のためだけに練習しています。 –

+0

また、wchar関数と_tchar関数の明示的な使用はなぜですか? –

+0

ソリューションが機能しました。私が持っていた問題は、nameSizeの値を最大の長さに戻すことではありませんでした。ありがとうございました。 –