// TODO: Add your control notification handler code here
OPENFILENAME ofn; // Структура диалога открытия файла
char szFile[260]; // Буфер для имени файла
HWND hwnd; // Окно-владелец
HANDLE hf; // Дескриптор файла
// Заполняем OPENFILENAME
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize=sizeof(ofn);
ofn.hwndOwner=hwnd;
ofn.lpstrFile=LPWSTR(szFile);
ofn.nMaxFile=sizeof(szFile);
ofn.lpstrFilter=LPWSTR("ALL\0*.*\0 Text\0*.TXT\0");
ofn.lpstrFileTitle=NULL;
ofn.nMaxFileTitle=0;
ofn.lpstrInitialDir=NULL;
ofn.Flags=OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST;
// Показываем диалог открытия файла
if(GetOpenFileName(&ofn)==TRUE)
hf=CreateFile(ofn.lpstrFile,
GENERIC_READ,
0,
(LPSECURITY_ATTRIBUTES)NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
(HANDLE)NULL);
else
MessageBox(_T("Не удаётся вызвать окно выбора файла"), _T("Ошибка!"), MB_OK);
FileOpen для Windows Mobile
Как в проекте MFC Smart Device Application на С++ вызвать стандартный диалог (если он вообще существует) OpenFile?
используя класс CFileDialog. или вопрос не в этом?
Цитата: Ation
используя класс CFileDialog. или вопрос не в этом?
1. Он, вроде, открываетт только Мои документы.
2. Я вот тут накорябал, но постоянно получаю сообщение (своё) об ошибке:
Код:
Но скорее всего дело в том, что ты не указываешь индекс. ZeroMemory его неявно обнулило, а индексация начинаеться с 1.
В любом случае, посмотри что возвращает GetLastError().
Цитата: Ation
Значит вызов с ошибкой, никто ведь не запрещает воспользоваться GetLastError().
Но скорее всего дело в том, что ты не указываешь индекс. ZeroMemory его неявно обнулило, а индексация начинаеться с 1.
В любом случае, посмотри что возвращает GetLastError().
Но скорее всего дело в том, что ты не указываешь индекс. ZeroMemory его неявно обнулило, а индексация начинаеться с 1.
В любом случае, посмотри что возвращает GetLastError().
Код:
MessageBox(LPCTSTR(GetLastError()), _T("Ошибка"), MB_OK);
мне ничего не возвращает.
И о каком индексе идёт речь?
Код:
ofn.nFilterIndex = 1;
Код:
MessageBox(LPCTSTR(GetLastError()), _T("Ошибка"), MB_OK);
мне ничего не возвращает.
[/QUOTE]
А скомпилировалось? по адресу ошибки никакой юникодной строки не лежит, по крайней мере не должно :) попробуй swprintf.
[QUOTE='Fan][;219997']
И о каком индексе идёт речь?
Код:
ofn.nFilterIndex = 1;
?
[/QUOTE]
И это именно тот индекс. Ведь во втором посте ты его не инициализировал.
а диалоговое окно как я понял не появляеться?
Цитата: Ation
А скомпилировалось? по адресу ошибки никакой юникодной строки не лежит, по крайней мере не должно :) попробуй swprintf.
И это именно тот индекс. Ведь во втором посте ты его не инициализировал.
а диалоговое окно как я понял не появляеться?
И это именно тот индекс. Ведь во втором посте ты его не инициализировал.
а диалоговое окно как я понял не появляеться?
Значит посмотрел в Autos'е. Для уверенности немного даже код изменил.
Код:
DWORD error=0;
error=GetLastError();
MessageBox(LPCTSTR(error), _T("Ошибка"), MB_OK);
error=GetLastError();
MessageBox(LPCTSTR(error), _T("Ошибка"), MB_OK);
После того, как error получает от GetLastError она становиться равной 6.
Посмотрел в своём Microsoft Platform Builder'e - вроде как получается ERROR_INVALID_HANDLE - The handle is invalid. Но в самом сообщении об ошибке ничего нет. Чистый лист!
Пробовал с индексом, и без него - один фиг.
Желаемое окно, естественно, не появляется.
Как только укажешь NULL или правильный хендл, все заработает (может забыл, но компилятор не обнуляет переменные при создании).
И еще раз про MessageBox, первым параметром должен идти указатель. Если так хочеться получить код ошибки, напечатай его в строку. А можешь воспользоваться FormatMessage (посмотри пример в мсдн), только вроде не гарантировано что на CE все ошибки покажет (ну про хендл должно).
И еще одно, этот диалог должен работать так же как класс из мфц, тоесть только в документах шариться. Так что проще всего написать свой диалог, для примера поищи книгу Булинга "Программирование WinCE", или как-то так. Там был пример со своим диалоговым окном выбора файла.
Цитата: Ation
итак поехали, ты указываешь hwnd, но нигде его не инициализируешь, вот тебе и неправильный хэндл.
Как только укажешь NULL или правильный хендл, все заработает (может забыл, но компилятор не обнуляет переменные при создании).
И еще раз про MessageBox, первым параметром должен идти указатель. Если так хочеться получить код ошибки, напечатай его в строку. А можешь воспользоваться FormatMessage (посмотри пример в мсдн), только вроде не гарантировано что на CE все ошибки покажет (ну про хендл должно).
И еще одно, этот диалог должен работать так же как класс из мфц, тоесть только в документах шариться. Так что проще всего написать свой диалог, для примера поищи книгу Булинга "Программирование WinCE", или как-то так. Там был пример со своим диалоговым окном выбора файла.
Как только укажешь NULL или правильный хендл, все заработает (может забыл, но компилятор не обнуляет переменные при создании).
И еще раз про MessageBox, первым параметром должен идти указатель. Если так хочеться получить код ошибки, напечатай его в строку. А можешь воспользоваться FormatMessage (посмотри пример в мсдн), только вроде не гарантировано что на CE все ошибки покажет (ну про хендл должно).
И еще одно, этот диалог должен работать так же как класс из мфц, тоесть только в документах шариться. Так что проще всего написать свой диалог, для примера поищи книгу Булинга "Программирование WinCE", или как-то так. Там был пример со своим диалоговым окном выбора файла.
Ну, вобщем так.
В OPENFILENAME поменял ofn.hwndOwner:
Код:
ofn.hwndOwner=NULL;
Про MessageBox - а у меня что не так?
И что за книга такая? Не нашёл что-то...
Про MessageBox - а у меня что не так?
И что за книга такая? Не нашёл что-то...[/QUOTE]
LPCTSTR() - говорит компилятору, что переменная внутри скобок есть ничто иное, как константный указатель на строку. (посмотрев определение ты увидишь что это const wchar_t* (ну если компилишь юникодный проект)).
Соответственно, для значения 6, получаем примерно следующее
wchar_t *string = (wchar_t*)6;
SetWindowText(MesWnd, string);
Функция ожидает увидеть указатель на область памяти, в которой сидит строка. Если и теперь не понятно, могу только посоветовать для начала разобраться с указателями.
а книга наверно просто не переведена, нашел онлайн версию тут
http://www.gikuzone.org/ebook/Developer/Programming_Microsoft_Windows_CE_Second_Edition/%23Default.htm
Цитата: Ation
LPCTSTR() - говорит компилятору, что переменная внутри скобок есть ничто иное, как константный указатель на строку. (посмотрев определение ты увидишь что это const wchar_t* (ну если компилишь юникодный проект)).
Соответственно, для значения 6, получаем примерно следующее
wchar_t *string = (wchar_t*)6;
SetWindowText(MesWnd, string);
Функция ожидает увидеть указатель на область памяти, в которой сидит строка. Если и теперь не понятно, могу только посоветовать для начала разобраться с указателями.
а книга наверно просто не переведена, нашел онлайн версию тут
http://www.gikuzone.org/ebook/Developer/Programming_Microsoft_Windows_CE_Second_Edition/%23Default.htm
Соответственно, для значения 6, получаем примерно следующее
wchar_t *string = (wchar_t*)6;
SetWindowText(MesWnd, string);
Функция ожидает увидеть указатель на область памяти, в которой сидит строка. Если и теперь не понятно, могу только посоветовать для начала разобраться с указателями.
а книга наверно просто не переведена, нашел онлайн версию тут
http://www.gikuzone.org/ebook/Developer/Programming_Microsoft_Windows_CE_Second_Edition/%23Default.htm
Это правильно?
Код:
wchar_t *error=(wchar_t*)GetLastError();
LPCTSTR mess=(LPCTSTR)error;
MessageBox(mess, _T("Ошибка"), MB_OK);
LPCTSTR mess=(LPCTSTR)error;
MessageBox(mess, _T("Ошибка"), MB_OK);
Почитай любую книгу или статью про С или С++ где написано что такое указатели. А этот оффтоп никчему.
Чтоб тебе было проще понять, вот правильный способ
Код:
wchar_t *str;
str = (wchar_t*)malloc(sizeof(wchar_t) * 10); // выделяем память
wsprintf(str, L"%d", GetLastError());
MessageBox(str, L"error", MB_OK);
free(str);
str = (wchar_t*)malloc(sizeof(wchar_t) * 10); // выделяем память
wsprintf(str, L"%d", GetLastError());
MessageBox(str, L"error", MB_OK);
free(str);
А еще лучше, если ты прочитал мои посты полностью, и посмотрел пример для FormatMessage в MSDN.
http://msdn2.microsoft.com/en-us/library/aa908810.aspx
Все, тему продолжать нет смысла.