где находится GetOpenFileName?

Тема в разделе "WASM.BEGINNERS", создана пользователем cresta, 29 июл 2005.

  1. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    ошибка:



    unresolved external symbol __imp__GetOpenFileNameA@4 referenced in function int __cdecl GetFileName (void)



    При этом непосредственно перед функцией, из которой вызывается GetOpenFileName, стоит:


    Код (Text):
    1.     #pragma comment(lib, "ComDlg32.Lib")
    2.  
    3.     #include    <commdlg.h>
    4.  
    5.  
    6. //===============================================================
    7. BOOL GetFileName(){
    8.     OPENFILENAME            ofn;
    9.  
    10.     RtlZeroMemory(&ofn, sizeof (OPENFILENAME));
    11.     ofn.hInstance=hInstance;
    12.     ofn.hwndOwner=hWnd;
    13.     ofn.lStructSize=sizeof (OPENFILENAME);
    14.     ofn.lpstrFilter = "All Files\0*.*\0";
    15.     ofn.lpstrFileTitle="Îòêðûòü ôàéë";
    16.     ofn.lpstrFile=FileName;
    17.     ofn.nMaxFile=260;
    18.     ofn.Flags=OFN_EXPLORER | OFN_FILEMUSTEXIST;
    19.  
    20.     return GetOpenFileName(&ofn);
    21. }




    Почему не видит?
     
  2. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Странно, у меня скомпилился такой файл
    Код (Text):
    1. #pragma comment(lib, "ComDlg32.Lib")
    2. #pragma comment(linker, "/entry:GetFileName")
    3. #pragma comment(linker, "/subsystem:console")
    4.  
    5. #include<windows.h>
    6. #include<commdlg.h>
    7.  
    8.  
    9. //===============================================================
    10. BOOL GetFileName(){
    11. OPENFILENAME ofn;
    12.  
    13. RtlZeroMemory(&ofn, sizeof (OPENFILENAME));
    14. //ofn.hInstance=hInstance;
    15. //ofn.hwndOwner=hWnd;
    16. ofn.lStructSize=sizeof (OPENFILENAME);
    17. ofn.lpstrFilter = "All Files\0*.*\0";
    18. ofn.lpstrFileTitle="Ioe?uou oaee";
    19. //ofn.lpstrFile=FileName;
    20. ofn.nMaxFile=260;
    21. ofn.Flags=OFN_EXPLORER | OFN_FILEMUSTEXIST;
    22.  
    23. return GetOpenFileName(&ofn);
    24. }
    25.  
     
  3. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    cresta

    Либо препроцессор почему-то игнорирует эту директиву, либо в опциях линкера стоит /NODEFAULTLIB:comdlg32.lib. Лучше всего вписать comdlg32.lib в командную строку линкера (это в опциях проекта есть), или добавить его в дерево проекта.
     
  4. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    S_T_A_S_



    Дык другой проект с аналогичной функцией и аналогичными директивами и ключами линкера нормально обрабатывается :dntknw:



    Quantum

    вставил в батник

    link myfile.obj myfile.res commdlg32.lib /subsystem:windows

    та же петрушка. Как впрочем и

    link myfile.obj myfile.res /link comdlg32.lib /subsystem:windows



    Из NODEFAULTLIB указаны только LIBCMT и OLDNAMES.
     
  5. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    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 заржавела, так ведь другой проект, в котором такой же код, компилится и линкуется без проблем :dntknw:((
     
  6. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    cresta



    comdlg32.lib





    Ключа /LINK не существует.



    Приаттачте сюда весь проект (*.C + *.DSP + *.RC)
     
  7. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Quantum



    Пардон, опечатка в посте, в ключе указано правильно: comdlg32.lib.



    Проекта нет, просто 4 файла и батники.







    [​IMG] _426491138__source.zip
     
  8. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Даёт warning из-за MERGE, но экзешник создаётся. На OpenFileName не ругается.
     
  9. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Что делать?



    LoadLibrary / GetProcAddress ?



    Должна ведь какая-то причина быть. Судя по тому, что другой проект нормально себя ведет на GetOpenFileName, ни .lib, ни линкер не при чём. Может перезагрузить комп :)))
     
  10. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Перезагрузка ничего не дала :)



    Остается


    Код (Text):
    1. HMODULE hLib = LoadLibraryA("comdlg32.dll");
    2. FARPROC hAddr = GetProcAddress(hLib, "GetOpenFileNameA");
    3.     __asm {
    4.         lea     eax,ofn
    5.         push    eax
    6.         mov     eax,hAddr
    7.         call    eax
    8.         mov     hAddr,eax
    9.         }
    10. FreeLibrary(hLib);
    11. return (BOOL)hAddr;
     
  11. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    мой исходник компилится просто:

    cl source.cpp



    это похоже на тёмные силы электричества.

    попробуй lib в папку с сорцами положить

    [​IMG] _1071605571__ComDlg32.Lib
     
  12. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    S_T_A_S_



    Оказывается либа дырявая :dntknw:

    С твоей нормально получается.



    Спасибо.
     
  13. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    может не в либе дело, а просто линкер её не там ищет? глянь, есть ли переменная среды LIB и чему она равна
     
  14. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Для всех проектов запускается один и тот же батник, в котором

    Set LIB=C:\vct\lib;%LIB%



    Прямо в этой папке и заменил на твою. Всё-таки либа дырявая.