Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: имя файла и GetOpenFileName  (Прочитано 16543 раз)
0 Пользователей и 1 Гость смотрят эту тему.
revolct
Гость
« : 13-08-2009 12:51 » 

Пытаюсь получить имя файла, но чёт не выходит. Примеры MSDN не работают
Код:
#include <windows.h>



OPENFILENAME ofn;
char szFile[260];
HWND hwnd;
HANDLE hf;
wchar_t cFilter[] = L"*.*\0\0";

inline void OpenWindow()
{
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hwnd;
ofn.lpstrFile = szFile;
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFilter = cFilter;
ofn.nFilterIndex = 2;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
return;
}




int main()
{
    OpenWindow();
if (GetOpenFileName(&ofn)==TRUE)
hf = CreateFile(ofn.lpstrFile, GENERIC_READ, 0, (LPSECURITY_ATTRIBUTES) NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,(HANDLE) NULL);
//тест
ShellExecute(NULL, NULL, &ofn.lpstrFile, NULL, NULL, SW_SHOWMAXIMIZED);
    return 0;


Да и ещё с преобразованием типов... Хотя в MSDN ofn.lpstrFile объявляется просто как char массив
Код:
1>main.cpp(16) : error C2440: =: невозможно преобразовать 'char [260]' в 'LPWSTR'
1>main.cpp(35) : error C2664: ShellExecuteW: невозможно преобразовать параметр 3 из 'LPWSTR *' в 'LPCWSTR'
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 13-08-2009 13:10 » 

Цитата: revolct
Хотя в MSDN ofn.lpstrFile объявляется просто как char массив
Но на самом деле является LPCTSTR (это, кстати, тоже написано в MSDN) - то есть, либо char*, либо wchar_t*,  в зависимости от настроек проекта, а точнее - опции использования UNICODE.
« Последнее редактирование: 13-08-2009 13:12 от Вад » Записан
revolct
Гость
« Ответ #2 : 13-08-2009 14:14 » 

Цитата: revolct
Хотя в MSDN ofn.lpstrFile объявляется просто как char массив
Но на самом деле является LPCTSTR (это, кстати, тоже написано в MSDN) - то есть, либо char*, либо wchar_t*,  в зависимости от настроек проекта, а точнее - опции использования UNICODE.
А где его можно включить/отключить?
PS студия одинаково ругается, что на char, что на wchar_t
« Последнее редактирование: 13-08-2009 14:25 от revolct » Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 13-08-2009 14:25 » 

В свойствах проекта, "General"->"Character Set". Только лучше не выключать Улыбаюсь Хотя дело вкуса, конечно.
Записан
revolct
Гость
« Ответ #4 : 13-08-2009 14:38 » 

В свойствах проекта, "General"->"Character Set". Только лучше не выключать Улыбаюсь Хотя дело вкуса, конечно.
А почему лучше не выключать?
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 13-08-2009 14:51 » 

Ну, просто потому, что поддержка юникода - это уже, практически, стандарт для Windows-приложений. Если не требуется совместимости с какими-то совсем дремучими версиями, то стоит использовать именно Unicode для пользовательского интерфейса. Меньше мороки и проблем с мультиязычностью.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #6 : 13-08-2009 15:21 » 

А так же скорость выше.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
revolct
Гость
« Ответ #7 : 13-08-2009 16:36 » 

когда юникод включен, то пытаюсь использовать wchar_t, и тогда в буфере с именем мусор оказывается. А когда без юникода и char то всё нормально. Почему так?
Записан
larry
Участник

ua
Offline Offline

« Ответ #8 : 16-08-2009 05:47 » 

У тебя ошибка при заполнении структуры OPENFILENAME...В поле ofn.hwndOwner = hwnd ты задаешь пустой дескриптор окна родителя...вот поэтому и не работает...на худой конец напиши hwnd = NULL; и все будет работать...
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #9 : 16-08-2009 10:03 » 

larry, он передаёт НЕИНИЦИАЛИЗИРОВАННОЕ значение, а не пустое )
Записан

larry
Участник

ua
Offline Offline

« Ответ #10 : 16-08-2009 11:19 » 

Алексей1153++, прошу прощения за промашку...все равно в данном случае это ошибка...
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #11 : 16-08-2009 15:54 » 

Эммм... это грубейшая и недопустимая ошибка не только в данном случае.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines