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 — говорит что неправленый параметр
А>А> ofn.nMaxFile = 9999;
А>
А>вот такой вот код почему то не срабатывает, уже устал искать причину, помогите пожалуйста, ошибка после GetOpenFileName — говорит что неправленый параметр
1) Как минимум nMaxFile неправильное. Это размер буффера 'lpstrFile' в символах
Возможно GetOpenFileName проверяет доступность 9999 байт (слов) по адресу 'lpstrFile'
2) Должно быть не меньше 256
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. Часто на этом попадаются...
Здравствуйте, 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 из примера, спасибо за ответ все заработало
если не изменяет склероз, все дело в неинициализированности буфера для имени файла — т.е. *FileName = '\0' исправит проблему (про 9999 уже сказали)
Здравствуйте, Адепт, Вы писали:
А>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 ;
Здравствуйте, Caracrist, Вы писали:
C>Здравствуйте, Адепт, Вы писали:
C>А>>OPENFILENAME ofn;
А>> PSTR FileName = new char [200];
C>
C>надеюсь вы переопределили PSTR (CHAR*)?
C>иначе будет утечка памяти...
Мдяя-я-я-я... Мудрый совет, ёпырш!

Неважно насколько красив (правилен, неправилен) код — если он не работает!