ошибка: unresolved external symbol __imp__GetOpenFileNameA@4 referenced in function int __cdecl GetFileName (void) При этом непосредственно перед функцией, из которой вызывается GetOpenFileName, стоит: Code (Text): #pragma comment(lib, "ComDlg32.Lib") #include <commdlg.h> //=============================================================== BOOL GetFileName(){ OPENFILENAME ofn; RtlZeroMemory(&ofn, sizeof (OPENFILENAME)); ofn.hInstance=hInstance; ofn.hwndOwner=hWnd; ofn.lStructSize=sizeof (OPENFILENAME); ofn.lpstrFilter = "All Files\0*.*\0"; ofn.lpstrFileTitle="Îòêðûòü ôàéë"; ofn.lpstrFile=FileName; ofn.nMaxFile=260; ofn.Flags=OFN_EXPLORER | OFN_FILEMUSTEXIST; return GetOpenFileName(&ofn); } Почему не видит?
Странно, у меня скомпилился такой файл Code (Text): #pragma comment(lib, "ComDlg32.Lib") #pragma comment(linker, "/entry:GetFileName") #pragma comment(linker, "/subsystem:console") #include<windows.h> #include<commdlg.h> //=============================================================== BOOL GetFileName(){ OPENFILENAME ofn; RtlZeroMemory(&ofn, sizeof (OPENFILENAME)); //ofn.hInstance=hInstance; //ofn.hwndOwner=hWnd; ofn.lStructSize=sizeof (OPENFILENAME); ofn.lpstrFilter = "All Files\0*.*\0"; ofn.lpstrFileTitle="Ioe?uou oaee"; //ofn.lpstrFile=FileName; ofn.nMaxFile=260; ofn.Flags=OFN_EXPLORER | OFN_FILEMUSTEXIST; return GetOpenFileName(&ofn); }
cresta Либо препроцессор почему-то игнорирует эту директиву, либо в опциях линкера стоит /NODEFAULTLIB:comdlg32.lib. Лучше всего вписать comdlg32.lib в командную строку линкера (это в опциях проекта есть), или добавить его в дерево проекта.
S_T_A_S_ Дык другой проект с аналогичной функцией и аналогичными директивами и ключами линкера нормально обрабатывается Quantum вставил в батник link myfile.obj myfile.res commdlg32.lib /subsystem:windows та же петрушка. Как впрочем и link myfile.obj myfile.res /link comdlg32.lib /subsystem:windows Из NODEFAULTLIB указаны только LIBCMT и OLDNAMES.
S_T_A_S_ Для проверки сделал файл один в один как в твоем посте, и батник: cd C:\ call vcvars32.bat if exist sample.exe del sample.exe cl /Ox sample.cpp link sample.obj /subsystem:windows pause if exist sample.exe call sample.exe Та же ошибка - unresolved external symbol, и появился только .obj. Предположил бы что линкер поломался или comdlg32 заржавела, так ведь другой проект, в котором такой же код, компилится и линкуется без проблем ((
Quantum Пардон, опечатка в посте, в ключе указано правильно: comdlg32.lib. Проекта нет, просто 4 файла и батники. _426491138__source.zip
Что делать? LoadLibrary / GetProcAddress ? Должна ведь какая-то причина быть. Судя по тому, что другой проект нормально себя ведет на GetOpenFileName, ни .lib, ни линкер не при чём. Может перезагрузить комп ))
Перезагрузка ничего не дала Остается Code (Text): HMODULE hLib = LoadLibraryA("comdlg32.dll"); FARPROC hAddr = GetProcAddress(hLib, "GetOpenFileNameA"); __asm { lea eax,ofn push eax mov eax,hAddr call eax mov hAddr,eax } FreeLibrary(hLib); return (BOOL)hAddr;
мой исходник компилится просто: cl source.cpp это похоже на тёмные силы электричества. попробуй lib в папку с сорцами положить _1071605571__ComDlg32.Lib
может не в либе дело, а просто линкер её не там ищет? глянь, есть ли переменная среды LIB и чему она равна
Для всех проектов запускается один и тот же батник, в котором Set LIB=C:\vct\lib;%LIB% Прямо в этой папке и заменил на твою. Всё-таки либа дырявая.