Я использую некоторые функции реестра из Windows API (RegOpenKeyEx
, RegQueryInfoKey
и RegEnumValue
). Скажем, это код, который у меня есть до сих пор:
const int MAX_VALUE_NAME= 16383;
const int MAX_DATA = 16383;
DWORD i;
HKEY hKey = HKEY_CURRENT_USER;
LPCTSTR lpSubKey = TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\RunMRU");
DWORD ulOptions = 0;
REGSAM samDesired = KEY_READ | KEY_WRITE | KEY_QUERY_VALUE;
HKEY phkResult;
DWORD dwIndex = 0;
TCHAR lpValueName[MAX_VALUE_NAME];
LPCTSTR ValueMRU;
BYTE *DataMRU;
DWORD lpcchValueName = MAX_VALUE_NAME;
BYTE lpData[MAX_DATA+2];
DWORD cbData = sizeof(lpData);
DWORD type;
TCHAR lpClass[MAX_PATH] = TEXT("");
DWORD lpcClass = MAX_PATH;
LPDWORD lpReserved = NULL;
DWORD lpcSubKeys = 0;
DWORD lpcMaxSubKeyLen;
DWORD lpcMaxClassLen;
DWORD lpcValues;
DWORD lpcMaxValueNameLen;
DWORD lpcMaxValueLen;
DWORD lpcbSecurityDescriptor;
FILETIME lpfLastWriteTime;
char *pMsg = NULL;
long R;
long OpenK = RegOpenKeyEx(hKey, lpSubKey, ulOptions, samDesired, &phkResult);
if (OpenK == ERROR_SUCCESS)
{
long Query = RegQueryInfoKey(phkResult, lpClass, &lpcClass, lpReserved, &lpcSubKeys, &lpcMaxSubKeyLen,
&lpcMaxClassLen, &lpcValues, &lpcMaxValueLen, &lpcMaxValueLen, &lpcbSecurityDescriptor, &lpfLastWriteTime);
if (Query == ERROR_SUCCESS)
{
if (lpcValues)
{
cout << "Number of values in the subkey: " << lpcValues << endl;
cout << "\nThe values are:: \n" << endl;
//Show RunMRU values and content.
for (i = 0; i < lpcValues; i++)
{
lpcchValueName = MAX_VALUE_NAME;
//lpValueName[0] = '\0';
lpValueName[MAX_VALUE_NAME];
//lpData[MAX_DATA + 2];
cbData = MAX_DATA;
R = RegEnumValue(phkResult, i, lpValueName, &lpcchValueName, NULL,
&type, lpData, &cbData);
int Quantity = strlen((const char *)lpData);
if (R != ERROR_NO_MORE_ITEMS)
{
cout << "\0" << lpValueName << ": " << lpData << endl;
cout << "Number of characters: " << Quantity << endl;
cout << "\n";
}
else
{
cout << "Error enumerating values. Code: " << R << endl;
}
}
} //EOIF.
И это то, что я получил:
Вопросы:
Оплаченный lpData получает значение, а не значение.
EDIT 1: я мог бы решить вопрос "\ 1", добавив это в FOR
:
int Quantity = strlen(lpData);
std::string original = lpData;
std::string result = original.substr(0, original.size() - 2);
std::string result = original.substr(0, Quantity - 2);
if (R != ERROR_NO_MORE_ITEMS)
{
cout << "\0" << lpValueName << ": " << (TCHAR*)result.c_str() << endl;
cout << "Numbers of characters: " << Quantity-2 << endl;
cout << "\n";
}
else
{
cout << "Error enumerating the values. Code: " << R << endl;
}
Теперь мне просто нужно знать, как избежать отображения значения MRUList в FOR.
char* dest = new char[strlen(lpData) - 2];
memcpy(dest, lpData, strlen(lpData) - 2)
//do stuff with dest..
delete[] dest;
Другой способ: std :: string it..
std::string dest = std::string(lpData);
dest.erase(std::find_last_of("\\1"), 2);
Я думаю, у вас может быть не только \1
. Можно иметь \2
или даже \100
, поэтому мой ответ показывает, как вырезать все это с самого конца.
Вам нужно подстроить значение. Попробуй это:
size_t len = strlen(lpData);
for (int i = len - i; i <= 0; --i)
{
if (lpData == '\\')
{
lpData[i] = '\0';
break;
}
}
В зависимости от настройки вам может понадобиться другая процедура вместо strlen
, вы можете выбрать ее здесь. Возможно wcslen
.
Как избежать отображения значения RunMRU без влияния на "для" и других значений и контента?
Это больше C
решение, тогда C++
но таким образом производительность лучше. Чистое решение C++
будет связано с std::string
и потребует больше часов, чтобы получить желаемый результат.
Также вы можете найти это полезным.
<string>
. Однако это решение неэффективно. Проверьте ответ выше моего. Я добавил комментарий, который должен помочь.