?

Log in

No account? Create an account
   Journal    Friends    Archive    Profile    Memories
 

C++ vs WinAPI - morfizm


Nov. 20th, 2017 09:07 pm C++ vs WinAPI

Правильно ли я понимаю, что при использовании современного C++ в сочетании с WinAPI, нужно везде в коде использовать обычные std::string, в которых хранить UTF-8, а для WinAPI делать wrapper'ы и вызывать *W функции с юникодом?

Я попробовал пойти альтернативным путём и начал создаваться отвратительный mess с кучей IFDEF'ов.

11 comments - Leave a commentPrevious Entry Share Next Entry

Comments:

From:archaicos
Date:November 21st, 2017 05:18 am (UTC)
(Link)
А чо wstring не канает? Чтоб без преобразования 8-16.
From:morfizm
Date:November 21st, 2017 05:58 am (UTC)
(Link)
А потом писать свой runtime_error и др. вещи? https://www.codeproject.com/Articles/4563/Upgrading-an-STL-based-application-to-use-Unicode
From:rezkiy
Date:November 21st, 2017 06:59 am (UTC)
(Link)
Погоди, а зачем?

Моя философия такая. Raii рулит поэтому мы его используем. Но неоткрывающиеся файлы это не эксепшен, это нормально. И error_io_pending это нормально. Эти все случаи мы обработаем через return values. Вот тот случай когда файла не было, мы его создали, и не смогли открыть -- это да, эксепшен.
From:morfizm
Date:November 21st, 2017 07:27 am (UTC)
(Link)
Каждый вызов даже самого безобидного WinAPI, который должен всегда или почти всегда succeed, это возможность возврата кода ошибки, который по логике программы мне нафиг не нужен. Например, GetUserName. Я не хочу проглатывать эти ошибки, а хочу чтобы кидались exceptions с нормальными сообщениями. Это вопрос стиля и вопрос удобства отладки каких-нибудь уёбищных случаев, когда оно таки fails, а не вопрос дизайна exceptions vs return values. Я тоже целиком за RAII, и при этом понимаю, когда имеет смысл таки вернуть значение через статусы. Но я не про это.
From:morfizm
Date:November 21st, 2017 05:57 am (UTC)
(Link)
(редачу и скрываю коммент)

> Во-первых, archaicos дело говорит, во-вторых, а попробуй потрогать вот этот свежачок и рассказать товарищам как оно.
> https://moderncpp.com/

Красота! Для моей задачи too heavyweight, но я с ним поиграюсь. Спасибо.

Edited at 2017-11-21 05:59 am (UTC)
From:rezkiy
Date:November 21st, 2017 06:40 am (UTC)
(Link)
Расскажи тогда про задачу. Я просто передавал wstrings когда надо было парсить что-то где могло быть не-аски, а потом win32::open() или win32::open_direct()
From:morfizm
Date:November 21st, 2017 07:18 am (UTC)
(Link)
У меня простая задача (для домашних нужд).

Я хочу сделать набор утилит, и они будут работать на JVM. Но чтобы они быстро запускались, JVM будет reused. Придумался такой механизм:

*) Есть JAR, который умеет всё. Скажем, десяток утилит. Они отличаются по именам.
*) Запускалка называется ToolName.exe. Можно скопировать его под другим именем, чтобы получить запускалку для другой тулы.
*) Запускалка копирует своё тело в %TEMP% под именем %USERNAME%ToolServer.exe, с флагом DELETE_ON_CLOSE. Запускает его и ждёт, чтобы подключиться к нему по такому Named Pipe: \\.\pipe\%USERNAME%ToolPipe. После этого шлёт туда stdin, слушает и отображает результаты на stdout. Потом закрывает соединение и закрывает handle.
*) Запустившись под именем %USERNAME%ToolServer.exe, создаётся две трубы: \\.\pipe\%USERNAME%ToolPipe чтобы общаться с клиентами и \\.\pipe\%USERNAME%ToolPipeJava чтобы общаться с JVM-сервером. Обе трубы ограничиваются в доступе, чтобы читать и писать мог только %USERNAME%. Запускается процесс java -jar tools.jar, ему через параметры передаётся имя трубы. ToolServer поддерживает много параллельных клиентов.
*) Java может 100% портабельно читать и писать существующую named pipe. Всё путём. Она слушает трубу, поддерживая параллелизм запуска тулов, и заодно ждёт сигнала о shutdown.
*) Когда ToolServer слишком долго idle, он просит Java-сервер за-shutdown'ниться, закрывает трубу и завершает работу. Файл на диске при этом уничтожается, потому что когда-то давно он был открыт с флагом DELETE_ON_CLOSE тем первым клиентским процессом.
*) У клиента должен быть какой-то retry loop, чтобы быть resilient against race conditions (что если этот момент idle timeout'а наступит ровно в момент запуска нового клиента?).

В общем, запускалка чисто для винды, со щедрым использованием WinAPI, а JVM-based code 100% портабельный, ни грама JNI и прочего нестандарта.
From:morfizm
Date:November 21st, 2017 07:41 am (UTC)
(Link)
Наверное, это надо отдельным постом, но для экономии места, пожалуюсь прямо здесь. В этой дурацкой вижуалстудии, чтобы сделать консольное приложение с юнит тестами, нужно создавать солюшн с аж 3 (тремя!) проектами. Отдельно LIB, отдельно EXE и отдельно юнит-тесты к LIB-у.
From:morfizm
Date:November 21st, 2017 07:42 am (UTC)
(Link)
А ещё, не пойму, почему Microsoft до сих пор не купил ReSharper и не встроил его бесплатно в Visual Studio.
From:enternet
Date:November 21st, 2017 09:02 am (UTC)
(Link)
Потому что решарпер абсолютно бесполезен. Это продукт для детей и лиц с нарушением цветового восприятия. В нем нет ни единой полезной в реальной работе функции. Под пользой я понимаю или сокращение времени разработки или уменьшение ошибок в итоговом коде. По первому вопросу студия и сама уже могёт. А по второму - майкрософт целенаправленно работает над анализом во время компиляции и последующими рекомендациями, что гораздо удобнее, чем анализ во время набора текста.
From:morfizm
Date:November 21st, 2017 09:35 am (UTC)
(Link)
Знакомые keybinding'и и функции навигации по коду - это неимоверное сокращение времени разработки. Без этого IDE мало отличается от vim'а.

Наверное, в Visual Studio всё есть, но я быстрее напишу свой проект, чем разберусь.