Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   *Решено* Win32API | Базовый диалог открытия файла сам не открывается (http://forum.oszone.net/showthread.php?t=46980)

Savant 21-03-2005 20:16 308821

*Решено* Win32API | Базовый диалог открытия файла сам не открывается
 
Я пас... где ошибка???
CommDlgExtendedError() возвращает по-видимому CDERR_INITIALIZATION
Цитата:

Цитата Windows SDK
The common dialog box function failed during initialization. This error often occurs when sufficient memory is not available.

с памятью вроде всё в порядке...

Код:

LPSTR buf =
Код:

new char[256];
 
OPENFILENAME ofn;
memset(&ofn, 0,

Код:

sizeof (OPENFILENAME));
ofn.lStructSize = sizeof (OPENFILENAME);
ofn.hwndOwner = hDlg; // это хэндл диалога, из которого запускаю
ofn.lpstrFilter = "Все файлы\0*.*\0\0";
ofn.nFilterIndex = 1;
ofn.lpstrFile = buf;
ofn.nMaxFile = 256;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_ENABLESIZING | OFN_HIDEREADONLY | OFN_NOREADONLYRETURN;
if (!GetOpenFileName(&ofn)) {
  sprintf(buf, "%d\0", CommDlgExtendedError());
  MessageBox(0, buf, "", 0);
}
 
delete buf;



Savant 22-03-2005 11:28 308967

С утречка вроде получше соображаться стало :). В общем слегка изменив предыдущий код, имеем:

Код:


char szFilter[] = TEXT("Все файлы (*.*)\0*.*\0\0");
char szBuf[MAX_PATH];
OPENFILENAME ofn;
 
memset(&ofn, 0, sizeof (OPENFILENAME));
memset(&szBuf, 0, sizeof (szBuf));
ofn.lStructSize = sizeof (OPENFILENAME);
ofn.hwndOwner = hWndMain; // это хэндл диалога, из которого запускаю, возвращенный CreateDialog()
ofn.lpstrFilter = szFilter;
ofn.nFilterIndex = 1L;
ofn.lpstrFile = szBuf;
ofn.nMaxFile = sizeof (szBuf);
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_ENABLESIZING | OFN_HIDEREADONLY | OFN_NOREADONLYRETURN;
 
if (!GetOpenFileName(&ofn)) {
  sprintf(szBuf, "%d\0", CommDlgExtendedError());
}
 
MessageBox(0, szBuf, "", 0);


Эта бяка уже работает превосходно :). Но мне всё же не ясно, что изменилось фактически...

pva 22-04-2005 12:06 318125

Отличие в том, что не инициализируешь имя файла (в буфере лежит всякая гадость, напр."~!\?/'" а не "\0"). Попробуй в примере №1 *buf = 0; Если поможет - напиши.

Savant 22-04-2005 15:19 318199

pva
Цитата:

Попробуй в примере №1 *buf = 0; Если поможет - напиши.
Само собой поможет :). Кстати в том же примере №1 есть и ошибка неприметная: вместо delete buf надо delete[] buf. Удалить-то нужно весь массив...


Время: 13:39.

Время: 13:39.
© OSzone.net 2001-