Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.07.2014, 17:35   #1
Nelkor
Пользователь
 
Регистрация: 04.07.2014
Сообщений: 10
Восклицание Проблема со статической сборкой

Всем привет!
Есть код, который редактирует реестр:

Код:
#include <Windows.h>

int WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
	char* keyPath = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon";
	char* szString = "C:\\Windows\\system32\\userinit.exe,";

	HKEY hKey;

	RegOpenKeyEx(HKEY_LOCAL_MACHINE, keyPath, 0, KEY_ALL_ACCESS, &hKey);
	RegSetValueEx(hKey, "Userinit", 0, REG_SZ, (BYTE*)szString, strlen(szString) + 1);
	RegCloseKey(hKey);

	return 0;
}
Код отлично работает как из самой Visual Studio, так и с любого стороннего компьютера, на котором по счастливой случайности оказались msvcr120.dll и прочие *.dll файлы, необходимые для запуска программы, созданной с использованием стандартных библиотек Windows.

На сторонних ПК, не имеющих этих dll, программа не запускается, и это логично.

Казалось бы, решение такой проблемы легко - в свойствах проекта изменить пункт "Использование MFC" на "Использовать MFC в статической библиотеке". И во всех случаях, кроме этого это решение помогало.

Однако, для этого примера, устанавливая "Использовать MFC в статической библиотеке" я получаю при сборке список ошибок:

Ошибка 2 error LNK2001: неразрешенный внешний символ "__imp_RegSetValueExA" D:\Cpp Projects\adder1\main.obj
Ошибка 3 error LNK2001: неразрешенный внешний символ "__imp_RegOpenKeyExA" D:\Cpp Projects\adder1\main.obj
Ошибка 4 error LNK2001: неразрешенный внешний символ "__imp_RegCloseKey" D:\Cpp Projects\adder1\main.obj

Повторюсь - с использованием стандартных библиотек Windows программа отлично работает, так что дело не в логике кода. Но всё-таки дело в самом коде, ведь с другими программами, созданными в этой же среде разработки проблем нет.
Nelkor вне форума Ответить с цитированием
Старый 05.07.2014, 21:31   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Подключите библиотеку advapi32.lib
waleri вне форума Ответить с цитированием
Старый 05.07.2014, 21:42   #3
Zenon
Пользователь
 
Регистрация: 03.07.2014
Сообщений: 32
По умолчанию

Такая ошибка на этапе сборки, а не запуска - значит дело не в наличии/отсутствии библиотек, а в том, что вы их не подключили (или подключили не те).

В MSDN написано, что функция RegSetValueEx требует библиотеку advapi32.lib. Убедитесь, что в опциях Linker/Input advapi32.lib упоминается.
Zenon вне форума Ответить с цитированием
Старый 05.07.2014, 23:11   #4
Nelkor
Пользователь
 
Регистрация: 04.07.2014
Сообщений: 10
По умолчанию

Всем спасибо, проблема решена!
Nelkor вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема со статической переменной Xuch Общие вопросы C/C++ 0 23.12.2013 19:35
Проблема с взаимодействием динамической и статической памяти - обращение к статической переменной Comst95 Паскаль, Turbo Pascal, PascalABC.NET 1 03.01.2012 18:46
Проблемы со сборкой. edge-hog Компьютерное железо 2 29.12.2010 11:52
помогите со сборкой изображения... ИЛ87 Помощь студентам 0 03.12.2007 22:39
Проблема со сборкой IP пакетов Дядя Фёдор Работа с сетью в Delphi 0 28.08.2007 11:19