Страница: 1 | 2 |
Вопрос: VC++ & Фатальная ошибка при компилировании
Добавлено: 20.02.06 00:34
Автор вопроса: TERMIT | Web-сайт:
Здраствуйте знатоки, тут такая хистори в общем. Подключил библиотеку ATLBASE.H, и работаю с CRegKey
Стоило только откомпилить и на тебе повалилось, вот кусок ошибок что выдает:
...
server.obj : error LNK2001: unresolved external symbol "public: long __thiscall ATL::CRegKey::Close(void)" (?Close@CRegKey@ATL@@QAEJXZ)
Debug/proga.exe : fatal error LNK1120: 7 unresolved externals
Error executing link.exe.
Помогие чем сможите, я потратил 4 часа в поисках инфы подобной об этой ошибке конкретно ничего нет +(. Может можно как то сделать ну к примеру как я делал с таймером когда о нвыдавал подобную бяку:
#pragma comment(lib, "winmm")
Плиззз помогите...
Ответы
Всего ответов: 17
Номер ответа: 1
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #1
Добавлено: 20.02.06 01:31
#pragma comment(lib,....) не всегда помогает. Например в DDK эта фича не работает.
В этом случае попробуй напрямую в опциях командной строки линкера указывать свою либу.
Либо в makefile или sources - что там у тебя используется.
Номер ответа: 2
Автор ответа:
TERMIT
ICQ: 5297101
Вопросов: 16
Ответов: 93
Web-сайт:
Профиль | | #2
Добавлено: 20.02.06 17:13
прописал получил следущее:
atl.lib ws2_32.lib /nologo /subsystem:windows /incremental:yes /pdb:"ebug/proga.pdb" /debug /machine:I386 /out:"ebug/proga.exe" /pdbtype:sept
Номер ответа: 3
Автор ответа:
TERMIT
ICQ: 5297101
Вопросов: 16
Ответов: 93
Web-сайт:
Профиль | | #3
Добавлено: 20.02.06 17:15
Сори раньше времени на кнопку тыркнул а редактирования нету... в общем нифига не изменилось +(... обычно что же делать то теперь... дрругие функции юзать не могу, нельзя.... +(
Номер ответа: 4
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #4
Добавлено: 20.02.06 19:37
Какая опция компилятора?
Multi-threaded Debug DLL (/MDd)
Или
Single?
Для ATL нужна Multi.
Номер ответа: 5
Автор ответа:
TERMIT
ICQ: 5297101
Вопросов: 16
Ответов: 93
Web-сайт:
Профиль | | #5
Добавлено: 20.02.06 21:43
Вот опция компилятора:
/nologo /MDd /w /W0 /GX /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_AFXDLL" /FR"ebug/" /Fp"ebug/proga.pch" /YX /Fo"ebug/" /Fd"ebug/" /FD /ZI /GZ /c
Номер ответа: 6
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #6
Добавлено: 20.02.06 22:04
Вроде все нормально.
/MDd
Еще раз, проблемы начались сразу после подключения ATLBASE.H?
И какой проект win32, mfs?
Номер ответа: 7
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #7
Добавлено: 20.02.06 22:28
Мне кажется есть только один выход - покажи исходники.
Номер ответа: 8
Автор ответа:
TERMIT
ICQ: 5297101
Вопросов: 16
Ответов: 93
Web-сайт:
Профиль | | #8
Добавлено: 20.02.06 22:58
>Еще раз, проблемы начались сразу после подключения ATLBASE.H?
Дык нет же, смотри я накодил вот что:
CRegKey key;
if(key.Open(HKEY_CURRENT_USER,"Software\\MYY"!=ERROR_SUCCESS)
if(key.Open(HKEY_LOCAL_MACHINE,"Software\\MYY"
!=ERROR_SUCCESS)
return false;
char s[512];
DWORD len=512;
if(key.QueryValue(s,"port",&len)!=ERROR_SUCCESS)
return false;
port=s;
и он выдает вот такую шнягу, как только я эти функции коментирую ну работы с реестром... так сразу все ок! но мне именно так нужно сделать! +(
На будущее не подскажеш где можно посматреть тип проекта, прост оу других исходников подобных гляну, а вообще win32
Номер ответа: 9
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #9
Добавлено: 20.02.06 23:18
TERMIT
На консоли (win32 console) проверил твой код - никаких проблем??
Может тебе невый проект создать? Глючит что - нить?
А тип проекта в свойствах.
Номер ответа: 10
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #10
Добавлено: 20.02.06 23:37
TERMIT
Создаешь себе проблемы на ровном месте
Почему нельзя традиционным способом сделать?
// или 1 если успешно, данные заполняются в буфер lpOutput
int RegGetDwordValue (HKEY RootKey, LPCTSTR lpSubKey, LPCTSTR lpValueName, LPDWORD lpOutput){
 WORD data_len;
HKEY hHandleKey;
LONG result;
 WORD dwType;
data_len=4;
result=RegOpenKeyEx(RootKey, lpSubKey, NULL,KEY_QUERY_VALUE, & hHandleKey);
if (ERROR_SUCCESS == result){
result=RegQueryValueEx(hHandleKey, lpValueName, NULL, &dwType, (LPBYTE) lpOutput, &data_len);
result=RegQueryValueEx(hHandleKey, lpValueName, NULL, &dwType, (LPBYTE) lpOutput, &data_len);
if (ERROR_SUCCESS == result && data_len!=0){
if (dwType==REG_DWORD){
RegCloseKey((HKEY)hHandleKey);
return data_len;
}
}
}
RegCloseKey((HKEY)hHandleKey);
return 0;
}
//===========================================
 WORD regValue;
char buffer[16];
if ( RegGetDwordValue( HKEY_LOCAL_MACHINE, "Software\\MYY", "port", ®Value ) ){
wsprintf ( buffer, "%d", regValue );
MessageBox (0, buffer, "Success", 0);
}
else
MessageBox (0, "Error", 0, 0);
И никаких проблем с левыми atl'ами.
Номер ответа: 11
Автор ответа:
TERMIT
ICQ: 5297101
Вопросов: 16
Ответов: 93
Web-сайт:
Профиль | | #11
Добавлено: 21.02.06 00:55
Эххх, тяжко блин, не читает он что то выдает ошибка постоянно ну месага срабатывает на ИНАЧЕ, фигова =(...
Ок можите подсказать как проще всего сделать построчное чтение файла... т.е. я хчоу сделать конфиг в файле и на каждой строке будет своя настройка к примеру:
port
name
tratata
99
COOL
WAW
вот... ну и конечно же запись в файл. Конфиг обычным файлом хочу сделать с доступом как у текстового обычного. Вот мож кто подкинет простенькие функции (готовые для использования), буду признателен.
HOOLIGAN, а насчет использования других функций ты прав! обязательно разберусь с этой темой, работа с реестром без либ доп. лучше безусловно! разберусь позже с этим вот только закончу с этой прогой...
ВСЕМ ОГРОМНЕЙШЕЕ СПАСИБА! VBNET ВСЕГДА ВЫРУЧАЕТ :D
Номер ответа: 12
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #12
Добавлено: 21.02.06 01:17
А зачем в файле? Можно ведь и в реестре, т.е. полностью заменить этот CReg::Key.
Всего-то 4 функции - читать/писать строковые данные и читать/писать дворды.
У меня они оформлены отдельным файлом reg.cpp, когда нужно работать с реестром - я его в проект подключил и всё
И #pragma comment(lib, advapi32.lib) работает безупречно. Это вам не атл.
Номер ответа: 13
Автор ответа:
TERMIT
ICQ: 5297101
Вопросов: 16
Ответов: 93
Web-сайт:
Профиль | | #13
Добавлено: 21.02.06 15:53
Да не только две, еще нужно проверить создан ли раздел этот в реестре + считать что то вчера не получилось я же написал... Короче нада вот что:
[:ЗАПИСЬ:]
Проверять создан ли раздел такой в реестре
Если нет тогда создавать его и записывать туда данные
Записывать двоичные данные (REG_DWORD)
Записывать (REG_SZ)
[:ЧТЕНИЕ:]
Читать данные с реестра выше указанные ДВОРДЫ И REG_SZ, и если нет таких данных ну пустые тогда там уже вызов конфигуратора будет у меня стоять... главное короче нада считать.
Вот такие нужны темы, если не трудно пришли на termit[suKbaka]list.ru свой reg.cpp или что то по этой теме хотя бы... Захотелось разобраться до конца чтобы в следущие разы не парица +)
Заранее спкасиба!
Номер ответа: 14
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #14
Добавлено: 21.02.06 22:05
Отослал. Там 6 функций для чтения/записи REG_SZ, REG_DWORD, REG_BINARY.
При чтении:
Ф-ции возвращают количество считанных байт (длину строки, или длину массива байт или 4 для дворда)
Если ошибка чтения (например нет ключа или параметра) - возвращают ноль.
При записи:
Ф-ции создают ключ/параметр, если его не было и записывают в него. Если ключ был, то просто запись в него.
Если запись успешно - возвращают 1, если ошибка - возвращают ноль.
Все ф-ции принимают в качестве параметров адреса переменных. Т.е. нужно передавать адрес переменной для чтения из неё, или для записи в неё.
Примерно так:
MyDwordValue = 123456;
RegSetDwordValue ("MyKey", "MyParameter", &MyDwordValue); //запись 123456 в двод-параметр
char MyString[256];
if ( RegGetStringValue("MyKey", "MyStringParam", MyString) )
MessageBox (0, MyString, 0, 0);
Номер ответа: 15
Автор ответа:
TERMIT
ICQ: 5297101
Вопросов: 16
Ответов: 93
Web-сайт:
Профиль | | #15
Добавлено: 22.02.06 17:19
Спасибо за функции Хулиган, проверю на днях сейчаз убечу дрюЧю +) траблы с оценками небольшие гы. Но думаю в этот раз разберусь с реестром точна. Кстате у меня когда я помниш писал мол срабатывает: "}else{" выдавалось у меня тогда сообщение но без НУЛЯ там было число не помню точно че то типа - 83131 это значит кол-во символов в масике он вернул мне? или как ьбы это понять вообще? почему тогда он сработало "}else{". В прочем я вопросов глупых много задаю...
ВСЕМ СПАСИБО! Респекта Хулигану