Диалог открытия файла
От: Адепт Беларусь  
Дата: 09.06.09 14:52
Оценка:
OPENFILENAME ofn;
    PSTR FileName  = new char [200];
        
    
    ZeroMemory(&ofn,sizeof(ofn)); // очистим структуру
    ofn.lStructSize = sizeof(ofn);
    ofn.hwndOwner = hWnd;
    ofn.lpstrFile = FileName;
    ofn.lpstrFilter = "All\0*.*\0Text\0*.TXT\0";
    ofn.nFilterIndex = 1;
    ofn.lpstrFileTitle = NULL;
    ofn.nMaxFileTitle = 0;
    ofn.lpstrInitialDir = NULL;
    ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
    ofn.nMaxFile = 9999;
    ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;



    bool ret = GetOpenFileName(&ofn); 
    int err  = GetLastError();
    if (!ret)
        return false;
    else{
        ret = LoadFromFile(FileName);
        if(!ret) 
            return false;

    }

    return true ;



вот такой вот код почему то не срабатывает, уже устал искать причину, помогите пожалуйста, ошибка после GetOpenFileName — говорит что неправленый параметр
Re: Диалог открытия файла
От: MShura  
Дата: 09.06.09 15:02
Оценка: +1
А>
А>    ofn.nMaxFile = 9999;
А>


А>вот такой вот код почему то не срабатывает, уже устал искать причину, помогите пожалуйста, ошибка после GetOpenFileName — говорит что неправленый параметр


1) Как минимум nMaxFile неправильное. Это размер буффера 'lpstrFile' в символах
Возможно GetOpenFileName проверяет доступность 9999 байт (слов) по адресу 'lpstrFile'
2) Должно быть не меньше 256
Re: Диалог открытия файла
От: Carc Россия http://www.amlpages.com/home.php
Дата: 09.06.09 16:14
Оценка: 5 (1) +1
1) Должно быть
 ofn.lpstrFilter = "All\0*.*\0Text\0*.TXT\0\0";//именно 2 нуля в конце - это признак конца строки (см. MSDN)

2) Что за бред в строке ofn.nMaxFIle? Откуда там 9999?
Виндовсу нужно знать размер массива в TCHAR
Должно быть

 ofn.nMaxFile = 200;//размер в TCHAR - сколько навыделяли, столько и указали.

//Можно и попроще что-то вроде
enum {MY_BUFF_SIZE=1024};//ну например 1024 символа зарезервим
TCHAR szBuff[MY_FUFF_SIZE]={0};
ofn.lpstrFile=szBuff;
ofn.nMaxFile=sizeof(szBuff)/sizeof(TCHAR);//размер нужен именно в TCHAR - не забываем делить на размер TCHAR...


3) Не забываем загрузить ComDlg32.DLL — всякие MFC, .NEt как правило уже держат ее в памяти. В чистом WinAPI коде это очень часто не так, и тогда GetOpenFilename возращает по любому FALSE. Часто на этом попадаются...
Aml Pages Home
Re[2]: Диалог открытия файла
От: Адепт Беларусь  
Дата: 09.06.09 17:30
Оценка:
Здравствуйте, Carc, Вы писали:

C>1) Должно быть

C>
C> ofn.lpstrFilter = "All\0*.*\0Text\0*.TXT\0\0";//именно 2 нуля в конце - это признак конца строки (см. MSDN)
C>

C>2) Что за бред в строке ofn.nMaxFIle? Откуда там 9999?
C>Виндовсу нужно знать размер массива в TCHAR
C>Должно быть

C>
C> ofn.nMaxFile = 200;//размер в TCHAR - сколько навыделяли, столько и указали.

C>//Можно и попроще что-то вроде
C>enum {MY_BUFF_SIZE=1024};//ну например 1024 символа зарезервим
C>TCHAR szBuff[MY_FUFF_SIZE]={0};
C>ofn.lpstrFile=szBuff;
C>ofn.nMaxFile=sizeof(szBuff)/sizeof(TCHAR);//размер нужен именно в TCHAR - не забываем делить на размер TCHAR...
C>


C>3) Не забываем загрузить ComDlg32.DLL — всякие MFC, .NEt как правило уже держат ее в памяти. В чистом WinAPI коде это очень часто не так, и тогда GetOpenFilename возращает по любому FALSE. Часто на этом попадаются...


9999 из примера, спасибо за ответ все заработало
Re: Диалог открытия файла
От: std.denis Россия  
Дата: 09.06.09 21:46
Оценка:
если не изменяет склероз, все дело в неинициализированности буфера для имени файла — т.е. *FileName = '\0' исправит проблему (про 9999 уже сказали)
Re: Диалог открытия файла
От: Caracrist https://1pwd.org/
Дата: 17.06.09 07:44
Оценка:
Здравствуйте, Адепт, Вы писали:



А>OPENFILENAME ofn;
А>    PSTR FileName  = new char [200];


надеюсь вы переопределили PSTR (CHAR*)?
иначе будет утечка памяти...


А>    ZeroMemory(&ofn,sizeof(ofn)); // очистим структуру
А>    ofn.lStructSize = sizeof(ofn);
А>    ofn.hwndOwner = hWnd;
А>    ofn.lpstrFile = FileName;
А>    ofn.lpstrFilter = "All\0*.*\0Text\0*.TXT\0";
А>    ofn.nFilterIndex = 1;
А>    ofn.lpstrFileTitle = NULL;
А>    ofn.nMaxFileTitle = 0;
А>    ofn.lpstrInitialDir = NULL;
А>    ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
А>    ofn.nMaxFile = 9999;
А>    ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;




А>    bool ret = GetOpenFileName(&ofn); 
А>    int err  = GetLastError();
А>    if (!ret)
А>        return false;
А>    else{
А>        ret = LoadFromFile(FileName);
А>        if(!ret) 
А>            return false;

А>    }

тут уже вышли из блока, а delete[] и не пахнет...
А>    return true ;
~~~~~
~lol~~
~~~ Single Password Solution
Re[2]: Диалог открытия файла
От: Carc Россия http://www.amlpages.com/home.php
Дата: 17.06.09 23:55
Оценка:
Здравствуйте, Caracrist, Вы писали:

C>Здравствуйте, Адепт, Вы писали:




C>
А>>OPENFILENAME ofn;
А>>    PSTR FileName  = new char [200];
C>


C>надеюсь вы переопределили PSTR (CHAR*)?

C>иначе будет утечка памяти...

Мдяя-я-я-я... Мудрый совет, ёпырш! Неважно насколько красив (правилен, неправилен) код — если он не работает!
Aml Pages Home
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.