Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

FileOpen для Windows Mobile

281
08 ноября 2007 года
Fan][
279 / / 19.12.2003
Как в проекте MFC Smart Device Application на С++ вызвать стандартный диалог (если он вообще существует) OpenFile?
2.9K
08 ноября 2007 года
Ation
96 / / 27.07.2004
используя класс CFileDialog. или вопрос не в этом?
281
09 ноября 2007 года
Fan][
279 / / 19.12.2003
Цитата: Ation
используя класс CFileDialog. или вопрос не в этом?



1. Он, вроде, открываетт только Мои документы.
2. Я вот тут накорябал, но постоянно получаю сообщение (своё) об ошибке:

Код:
// 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);
2.9K
12 ноября 2007 года
Ation
96 / / 27.07.2004
Значит вызов с ошибкой, никто ведь не запрещает воспользоваться GetLastError().
Но скорее всего дело в том, что ты не указываешь индекс. ZeroMemory его неявно обнулило, а индексация начинаеться с 1.
В любом случае, посмотри что возвращает GetLastError().
281
14 ноября 2007 года
Fan][
279 / / 19.12.2003
Цитата: Ation
Значит вызов с ошибкой, никто ведь не запрещает воспользоваться GetLastError().
Но скорее всего дело в том, что ты не указываешь индекс. ZeroMemory его неявно обнулило, а индексация начинаеться с 1.
В любом случае, посмотри что возвращает GetLastError().



 
Код:
MessageBox(LPCTSTR(GetLastError()), _T("Ошибка"), MB_OK);

мне ничего не возвращает.

И о каком индексе идёт речь?
 
Код:
ofn.nFilterIndex = 1;
?
2.9K
14 ноября 2007 года
Ation
96 / / 27.07.2004
[QUOTE='Fan][;219997']
 
Код:
MessageBox(LPCTSTR(GetLastError()), _T("Ошибка"), MB_OK);

мне ничего не возвращает.
[/QUOTE]
А скомпилировалось? по адресу ошибки никакой юникодной строки не лежит, по крайней мере не должно :) попробуй swprintf.
[QUOTE='Fan][;219997']
И о каком индексе идёт речь?
 
Код:
ofn.nFilterIndex = 1;

?
[/QUOTE]
И это именно тот индекс. Ведь во втором посте ты его не инициализировал.
а диалоговое окно как я понял не появляеться?
281
14 ноября 2007 года
Fan][
279 / / 19.12.2003
Цитата: Ation
А скомпилировалось? по адресу ошибки никакой юникодной строки не лежит, по крайней мере не должно :) попробуй swprintf.

И это именно тот индекс. Ведь во втором посте ты его не инициализировал.
а диалоговое окно как я понял не появляеться?



Значит посмотрел в Autos'е. Для уверенности немного даже код изменил.

 
Код:
DWORD error=0;
        error=GetLastError();
        MessageBox(LPCTSTR(error), _T("Ошибка"), MB_OK);

После того, как error получает от GetLastError она становиться равной 6.
Посмотрел в своём Microsoft Platform Builder'e - вроде как получается ERROR_INVALID_HANDLE - The handle is invalid. Но в самом сообщении об ошибке ничего нет. Чистый лист!
Пробовал с индексом, и без него - один фиг.
Желаемое окно, естественно, не появляется.
2.9K
15 ноября 2007 года
Ation
96 / / 27.07.2004
итак поехали, ты указываешь hwnd, но нигде его не инициализируешь, вот тебе и неправильный хэндл.
Как только укажешь NULL или правильный хендл, все заработает (может забыл, но компилятор не обнуляет переменные при создании).
И еще раз про MessageBox, первым параметром должен идти указатель. Если так хочеться получить код ошибки, напечатай его в строку. А можешь воспользоваться FormatMessage (посмотри пример в мсдн), только вроде не гарантировано что на CE все ошибки покажет (ну про хендл должно).
И еще одно, этот диалог должен работать так же как класс из мфц, тоесть только в документах шариться. Так что проще всего написать свой диалог, для примера поищи книгу Булинга "Программирование WinCE", или как-то так. Там был пример со своим диалоговым окном выбора файла.
281
15 ноября 2007 года
Fan][
279 / / 19.12.2003
Цитата: Ation
итак поехали, ты указываешь hwnd, но нигде его не инициализируешь, вот тебе и неправильный хэндл.
Как только укажешь NULL или правильный хендл, все заработает (может забыл, но компилятор не обнуляет переменные при создании).
И еще раз про MessageBox, первым параметром должен идти указатель. Если так хочеться получить код ошибки, напечатай его в строку. А можешь воспользоваться FormatMessage (посмотри пример в мсдн), только вроде не гарантировано что на CE все ошибки покажет (ну про хендл должно).
И еще одно, этот диалог должен работать так же как класс из мфц, тоесть только в документах шариться. Так что проще всего написать свой диалог, для примера поищи книгу Булинга "Программирование WinCE", или как-то так. Там был пример со своим диалоговым окном выбора файла.



Ну, вобщем так.
В OPENFILENAME поменял ofn.hwndOwner:

 
Код:
ofn.hwndOwner=NULL;


Про MessageBox - а у меня что не так?

И что за книга такая? Не нашёл что-то...
2.9K
15 ноября 2007 года
Ation
96 / / 27.07.2004
[QUOTE='Fan][;220316']
Про 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
281
16 ноября 2007 года
Fan][
279 / / 19.12.2003
Цитата: 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



Это правильно?

 
Код:
wchar_t *error=(wchar_t*)GetLastError();
LPCTSTR mess=(LPCTSTR)error;
MessageBox(mess, _T("Ошибка"), MB_OK);
2.9K
16 ноября 2007 года
Ation
96 / / 27.07.2004
блин, ты конечно не обижайся, но у меня такое ощущение, что еще вчера ты прогал на бейсике. Что за попытки угадать?
Почитай любую книгу или статью про С или С++ где написано что такое указатели. А этот оффтоп никчему.
Чтоб тебе было проще понять, вот правильный способ
 
Код:
wchar_t *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
Все, тему продолжать нет смысла.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог