Visual C ++ ошибка: RegGetValueA не может быть расположен - PullRequest
1 голос
/ 28 февраля 2011

Попытка написать простой скрипт проверки реестра в Visual Studio 2010, работающий на XP SP3 x86.

Нет ошибок при сборке, но при отладке программа завершается со следующей ошибкой:

Точка входа в процедуру RegGetValueA не может быть расположен в динамическом библиотека ссылок ADVAPI32.dll

Вот весь код программы.

// #define _WIN32_WINNT 0x0501

#include <stdlib.h>
#include <stdio.h>
#include <windows.h>

int main(int argc, char *argv[])
{
long reg = RegQueryValueEx(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Run", NULL,NULL,NULL,NULL);
// if (reg!=ERROR_SUCCESS) MessageBox(0, "Error Opening Registry Key", "Error", 0);
return 0;
}

Комментарии в коде выше добавлены на основе ответа wmeyer.
При отсутствии комментария код не завершается с этой ошибкой, но выдает другую ошибку:

Отладочная информация для Test5.exe не может быть найден или не соответствует. Двоичный файл не был построен с отладкой Информация. Вы хотите продолжить отладки?

Если я продолжу, MessageBox выскакивает с «Ошибка открытия ключа реестра».

Я попытался заменить функцию RegQueryValueEx следующими тремя другими методами, по одному за раз.
Я ЗНАЮ, ЧТО ДВЕ ИЗ них ТОЛЬКО ВИСТА, но я хотела посмотреть, будет ли ошибка другой.
Это не было.

long reg = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_ALL_ACCESS, hKey);

// Vista+ PHKEY hKey;
long reg = RegOpenKey(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Run", hKey);
long reg = RegGetValue(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Run", "", RRF_RT_ANY, NULL, NULL,NULL);

Я уже потерял часы, пытаясь отработать несколько других ошибок, таких как «невозможно преобразовать параметр 1 из« char »в« LPCWSTR »» - что было решено путем изменения конфигурации и «Не удается найти или открыть файл PDB», решается путем изменения конфигурации .

Итак, еще раз, вопрос должен быть ясен:

  1. Как мне справиться с ошибкой?
  2. Как помогло предложение wmeyer'а о добавлении заголовка для фильтрации методов только для Vista, когда у проги нет методов Vista для начала? И почему программа до сих пор не работает?

Мой компьютер определенно имеет файл advapi.dll в Windows / syatem32.

EDIT: Полностью переписал вопрос, когда в ответах указывалось, насколько непонятным он был.
Первоначально я предполагал, что Visual Studio 2010 не имеет обратной совместимости с XP.
Мне принудительно сказали, что это неправильно, но я все еще не могу заставить VS работать.

Ответы [ 2 ]

3 голосов
/ 28 февраля 2011

Если вы хотите, чтобы ваш код работал в XP или более ранней системе, используйте RegQueryValueEx .

В любом случае вам следует сначала проверить документацию, а затем выполнить поиск в Google. Win32 API очень хорошо документирован, с подробностями о получении данных из реестра и поддерживаемой информацией об ОС на странице каждой функции, например, RegGetValue поддерживается в XP 64bit и более поздних версиях.

2 голосов
/ 28 февраля 2011

Вам следует установить _WIN32_WINNT на версию Windows, на которую вы нацелены.

См. Здесь: http://msdn.microsoft.com/en-us/library/aa383745(v=vs.85).aspx#setting_winver_or__win32_winnt

...