Удалите «\ 1» в конце строки буфера и не показывайте значение - WinAPI и C ++

0

Я использую некоторые функции реестра из 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.

И это то, что я получил:

Изображение 174551

Вопросы:

  1. Как удалить "\ 1" в конце строки из lpData? [ Решено: см. Ниже ]

Оплаченный lpData получает значение, а не значение.

  1. Как избежать отображения значения RunMRU без влияния на "для" и других значений и контента?

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.

Теги:
winapi

2 ответа

0
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);
  • 0
    Привет, "find_last_of" не найден. Какой заголовок я должен добавить?
  • 0
    Он включается во что угодно, используя заголовок <string> . Однако это решение неэффективно. Проверьте ответ выше моего. Я добавил комментарий, который должен помочь.
0

Я думаю, у вас может быть не только \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 и потребует больше часов, чтобы получить желаемый результат.


Также вы можете найти это полезным.

  • 0
    Спасибо! Но не работает, потому что мне нужно инициализировать len следующим образом: size_t len = strlen ((const char *) lpData); Цикл не позволяет операнда BYTE с символом. Любая идея?
  • 0
    У вас есть UNICODE, определенный в вашем проекте?
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню