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'
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #1 : 13-08-2009 13:10 » |
|
Хотя в MSDN ofn.lpstrFile объявляется просто как char массив Но на самом деле является LPCTSTR (это, кстати, тоже написано в MSDN) - то есть, либо char*, либо wchar_t*, в зависимости от настроек проекта, а точнее - опции использования UNICODE.
|
|
« Последнее редактирование: 13-08-2009 13:12 от Вад »
|
Записан
|
|
|
|
revolct
Гость
|
|
« Ответ #2 : 13-08-2009 14:14 » |
|
Хотя в MSDN ofn.lpstrFile объявляется просто как char массив Но на самом деле является LPCTSTR (это, кстати, тоже написано в MSDN) - то есть, либо char*, либо wchar_t*, в зависимости от настроек проекта, а точнее - опции использования UNICODE. А где его можно включить/отключить? PS студия одинаково ругается, что на char, что на wchar_t
|
|
« Последнее редактирование: 13-08-2009 14:25 от revolct »
|
Записан
|
|
|
|
Вад
|
|
« Ответ #3 : 13-08-2009 14:25 » |
|
В свойствах проекта, "General"->"Character Set". Только лучше не выключать Хотя дело вкуса, конечно.
|
|
|
Записан
|
|
|
|
revolct
Гость
|
|
« Ответ #4 : 13-08-2009 14:38 » |
|
В свойствах проекта, "General"->"Character Set". Только лучше не выключать Хотя дело вкуса, конечно. А почему лучше не выключать?
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #5 : 13-08-2009 14:51 » |
|
Ну, просто потому, что поддержка юникода - это уже, практически, стандарт для Windows-приложений. Если не требуется совместимости с какими-то совсем дремучими версиями, то стоит использовать именно Unicode для пользовательского интерфейса. Меньше мороки и проблем с мультиязычностью.
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
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
Участник
Offline
|
|
« Ответ #8 : 16-08-2009 05:47 » |
|
У тебя ошибка при заполнении структуры OPENFILENAME...В поле ofn.hwndOwner = hwnd ты задаешь пустой дескриптор окна родителя...вот поэтому и не работает...на худой конец напиши hwnd = NULL; и все будет работать...
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 13
|
|
« Ответ #9 : 16-08-2009 10:03 » |
|
larry, он передаёт НЕИНИЦИАЛИЗИРОВАННОЕ значение, а не пустое )
|
|
|
Записан
|
|
|
|
larry
Участник
Offline
|
|
« Ответ #10 : 16-08-2009 11:19 » |
|
Алексей1153++, прошу прощения за промашку...все равно в данном случае это ошибка...
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
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."
|
|
|
|