Показаны сообщения с ярлыком windows. Показать все сообщения
Показаны сообщения с ярлыком windows. Показать все сообщения

вторник, 27 марта 2012 г.

char to TCHAR

Очень популярная задача при использовании WinAPI и предлагается куча решений. Но большинство из них почему-то сходятся к выделению массива TCHAR в куче с помощью new либо использованию массива фиксированной длины. Мне больше всего нравится такое решение:

            //исходная строка
            const std::string dev_name = "COM4";
            //создаем вектор нужной длины с учетом терминального нуля в конце
            std::vector<TCHAR> tchar_dev_name(dev_name.size() + 1);
            //важно! используем std::copy(), а не memcpy()
            std::copy(dev_name.begin(), dev_name.end(), tchar_dev_name.begin());
            //нулевой символ в конце обязателен 
            tchar_dev_name[tchar_dev_name.size() - 1] = 0;
             
            //дальше все как обычно
            m_port = CreateFile(
                    &tchar_dev_name[0],
                    GENERIC_READ | GENERIC_WRITE, 
                    0, 
                    NULL, 
                    OPEN_EXISTING, 
                    0, 
                    NULL 
                    ); 

Не надо выделять память руками и освобождать ее тоже не надо - за нас все делает STL. Уже на пару строчек меньше. И надежнее. Почему используем std::copy() вместо memcpy()? Потому что TCHAR, вообще говоря, это не тип, а макрос, который определяет тип (char или wchar_t) в зависимости от. То есть, в общем случае нельзя утверждать, что sizeof(char)==sizeof(wchar_t), а значит и memcpy() нам тоже не подходит и вместо него мы используем функцию std::copy(), которая копирует символы из одной строки в другую поштучно.

четверг, 3 декабря 2009 г.

Скрытие cmd-окна при запуске java-программ

Достаточно странные результаты в первых строчках выдает гугл, если спросить у него "how to hide cmd window in windows" или "hide cmd line". Ведь просто-напросто необходимо запустить некую программу с параметрами ипосле запуска командная строка уже не нужна и сильно раздражает. Для этого можно использовать команду start с ключом /b. Конкретно у меня проблема возникла при запуске джавашных программ, хотя то же, естественно, применимо для любых не-консольных программ, запускающихся с параметрами. Для джавы решение такое:

1) использовать не java, а jawaw;
2)указать командному интерпретатору Windows скрыть окно.

Если раньше cmd-файлик запуска java-класса был таким:

java -Xms128m -Xmx512m -classpath F:\Projects\JavaProjects\GetOborotToBank\bin;F:\Projects\JavaProjects\GetOborotToBank\lib\classes12.jar GetOborotToBank -outfile c:\outfile.txt

Теперь он выглядит так:

start /B javaw -Xms128m -Xmx512m -classpath F:\Projects\JavaProjects\GetOborotToBank\bin;F:\Projects\JavaProjects\GetOborotToBank\lib\classes12.jar;F:\Projects\JavaProjects\GetOborotToBank\lib\javadbf.jar GetOborotToBank -outfile c:\outfile.txt

То есть мы "java" заменили на "javaw" и перед командой добавили "start /B". Последнее действие скрывает cmd-окно.

Взято отсюда:
http://www.rsdn.ru/forum/java/2647235.flat.aspx

Официальная майкрософтовская справка по команде start:
http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/start.mspx?mfr=true