130 / 33 / 4
Регистрация: 18.11.2012
Сообщений: 1,412
|
||||||||||||||||
1 | ||||||||||||||||
Петзольд. Работа с LB_DIR и функция OpenFile()16.09.2023, 08:23. Показов 1465. Ответов 14
Метки нет Все метки)
(
Здравствуйте! Хочу спросить вот о чём, в книге Петзольда есть такой пример, он довольно прост, но не работает, так как в примере используется функция OpenFile(), а она требует в качестве параметра строки, строку ascii, но это ерунда, интересует другое. И так вот пример того, как это реализовано у автора:
Кликните здесь для просмотра всего текста
Вопрос в том, почему автор задаёт такое условие:
не файл, то должно вернуться значение -1 т.е. ошибка.., но это странно... Если же всё в порядке, то функция должна вернуть дескриптор файла, но у меня функция OpenFile(), в случае успеха, возвращает 1, что это за дескриптор такой не ясно. Так как OpenFile() работает с ascii символами, а я извлекаю символы TCHAR, то я её вызываю так, точнее прежде, чем вызвать функцию я преобразовываю символы, вот так: Кликните здесь для просмотра всего текста
Как вообще распознать каталог это или файл в функции CreateFile, возможно ли это? Или всё же нужно дополнительно вызывать функцию GetFileInformationByHandle и уже после её вызова, распознавать, что это каталог или файл? Ну и по поводу OpenFile() тоже хочется узнать, почему всё же она не работает у меня так как у автора?
0
|
|
16.09.2023, 08:23 | |
Ответы с готовыми решениями:
14
функция openfile Как соединить сигнал класса MainWindow openFile c слотом класса MainController openFile? nmake и Петзольд Петзольд. dll. shared segment OpenFile нужна помошь! |
18465 / 9623 / 2355
Регистрация: 30.01.2014
Сообщений: 16,875
|
|
16.09.2023, 12:37 | 2 |
Да.
Потом что у автора не-UNICODE проект. Если речь идет про эту книгу: "Программирование для Windows 95", то причины прозрачны: в этой системе не было поддержки юникода (да, к ней существует специальное дополнение, которое добавляет ограниченную поддержку, но это вряд ли могло затронуть данную книгу).
0
|
130 / 33 / 4
Регистрация: 18.11.2012
Сообщений: 1,412
|
|||||||||||
17.09.2023, 00:06 [ТС] | 3 | ||||||||||
Не по теме: Да, именно про эту книгу. У него есть другие книги по этой тематике? Я же преобразовал UNICODE символы к ansi почему и после этого не работает так как надо... По поводу условия, что оно значит, что должно произойти, если, например, я выбираю в listbox-е, [..], это же, по сути, означает каталог, правильно, значит что, функция должна вернуть -1, но это же ошибка, почему так не могу понять.
Кликните здесь для просмотра всего текста
Но, если я выбираю [..] в каталоге с приложением т.е. место откуда запустил программу, то возвращается результат не каталог, хотя, если перейду в каталог уровнем ниже и там кликну на [..], то всё отрабатывает как надо, почему так? Почему первоначально в listbox-е два [..], так не должно быть, верно?
0
|
130 / 33 / 4
Регистрация: 18.11.2012
Сообщений: 1,412
|
||||||
18.09.2023, 00:27 [ТС] | 5 | |||||
Это атрибуты файлов или каталогов, добавляемых в список. У автора это указано как число.
Я всё же не пойму одну вещь, если я запускаю программу из каталога в котором она находится(каталог HEAD), то это что, корневой каталог, почему не хочет подниматься в каталог уровнем выше? При условии, что программа находится не в корневом каталоге не C:\dir, D:\, а гораздо глубже, скажем D:\MyFolder\Документы\__Projects\Petzold\HEAD, почему не хочет идти в папку Petzold, если я кликаю по [..]? Если же я спущусь на уровень ниже, то всё хорошо функционирует, если клацнуть на [..], то иду в каталог уровнем выше и OpenFile отрабатывает как надо, возвращает -1, если клацнуть на каталоге... Ну и..., почему всё же два [..] в каталоге из которого запущена программа, что это значит?
0
|
130 / 33 / 4
Регистрация: 18.11.2012
Сообщений: 1,412
|
|
21.09.2023, 00:25 [ТС] | 6 |
А что делать с чтением из файла и выводом, выводится какая-то ерунда, иероглифы. Если файл в кодировке UTF16-LE с BOM, то всё отлично читается и выводится, но если ansi или UTF8 с BOM, то читаются иероглифы. Буфер у меня объявлен как
Код
static TCHAR szReadBuffer[MAXREAD]
0
|
237 / 89 / 24
Регистрация: 07.01.2023
Сообщений: 354
|
|
23.09.2023, 10:35 | 7 |
Так есть чудесные функции GetStringTypeW, MultiByteToWideChar и WideCharToMultiByte. Используйте их
0
|
265 / 108 / 18
Регистрация: 26.12.2010
Сообщений: 450
|
|
24.09.2023, 22:01 | 8 |
-1 свидетельствует об ошибке (HFILE_ERROR ) , поэтому идет проверка на это значение. Это как if !(INVALID_HANDLE_VALUE != CreateFile).
А вообще, не юзайте эти древние апи.
0
|
130 / 33 / 4
Регистрация: 18.11.2012
Сообщений: 1,412
|
|
24.09.2023, 23:58 [ТС] | 9 |
Не понял, что в ней чудесного, а по поводу функций преобразования MultiByteToWideChar и WideCharToMultiByte, то я их пробовал применять, но, если в массив считались символы в виде иероглифов, то толку от этих функций нет. Поэтому и спрашивал, можно ли определить кодировку файла в ходе выполнения программы чтобы понять, какой буфер использовать с char* или wchar_t*. Ответ нашёл, нет нельзя.
Добавлено через 3 минуты CreatrFile() древняя API?! Пробовал и так и так т.е. и те и те функции результат один. Я пытался сохранить ту логику приложения, которую первоначально задал автор, не хотелось менять что-то кардинально.
0
|
COM‐пропагандист
|
|
25.09.2023, 07:31 | 10 |
По метке BOM можно определить юникодную кодировку.
Смотрим первые байты файла. EF BB BF — это кодировка UTF-8 FE FF — кодировка UTF-16 BE FF FE — кодировка UTF-16 LE 00 00 FE FF — кодировка UTF-32 BE FF FE 00 00 — кодировка UTF-32 LE Если нет, значит это ASCII кодировка.
0
|
237 / 89 / 24
Регистрация: 07.01.2023
Сообщений: 354
|
|
25.09.2023, 13:36 | 11 |
рукалицо.....
При чем тут "символы в види иероглифов"? Вы считываете ПОСЛЕДОВАТЕЛЬНОСТЬ БАЙТ. А уже работой с многобайтными кодировками приводите ее к последовательности СИМВОЛОВ.
0
|
130 / 33 / 4
Регистрация: 18.11.2012
Сообщений: 1,412
|
|
26.09.2023, 00:49 [ТС] | 12 |
А при том. Если строка считана в память в таком виде, то после преобразований с помощью вышеперечисленных функций ничего толкового, членораздельного, вменяемого, что можно прочитать не получается.
0
|
265 / 108 / 18
Регистрация: 26.12.2010
Сообщений: 450
|
|
26.09.2023, 16:20 | 14 |
Liss29, CreateFile нормальная, OpenFile древняя
поменяйте на INVALID_HANDLE_VALUE != CreateFile, будет та же логика
0
|
130 / 33 / 4
Регистрация: 18.11.2012
Сообщений: 1,412
|
|
27.09.2023, 08:48 [ТС] | 15 |
Я же написал, что пробовал так и так, хотя ваша правда, условие не совсем так проверял, когда использовал CreateFile().
if(hFile != INVALID_HANDLE_VALUE), но если возвращалось единица, то что, получалось, что условие выполнялось не правильно, но с этим я разобрался. Я же спрашивал почему в листбокс выводится два [..] в этом и была проблема? после её устранения заработало и с CreateFile() и с OpenFile(). Правда возникла другая проблема.
0
|
27.09.2023, 08:48 | |
27.09.2023, 08:48 | |
Помогаю со студенческими работами здесь
15
OpenFile и runtime error 216 Что значит 2-й параметр функции OpenFile? Как использовать OpenFile, ReadFile и WriteFile Visual Studio 2008, WinAPI - Openfile Можно ли API функцией OpenFile запустить exe? Использование DiscUtils. NotImplementedException при вызове OpenFile Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |