Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» C++ WinAPI

Автор: kenny5705
Дата сообщения: 19.05.2012 17:49
Abs62

Цитата:
CreateFileW(L"\\\\.\\C:",...

А что значит эта буква L, просто не раз ее уже встречаю, хотелось бы знать в чем у меня пробелы.
И как сделать чтобы вместо константы "\\\\.\\C:" использовать переменную типа char?
С L"\\\\.\\C:" - работает, спасибо.


Цитата:
А там юникодная программа собирается или ANSI?

Не знаю. Как узнать, где посмотреть? И в чем разница?


Цитата:
Подсунуть ему последнюю версию w32api от MinGW, надо полагать.

Не помогло, подкинул w32api-3.17-2. Проблемка сохранилась, работает не со всей библиотекой winapi. Думаю все-таки придется на VS 2010 переходить.

Еще вопрос.
Так получается тоже делать нельзя:
char fullPath[ MAX_PATH ];
GetCurrentDirectory( sizeof( fullPath ), (LPWSTR)fullPath );
Автор: akaGM
Дата сообщения: 19.05.2012 17:55
замени char на wchar_t
Автор: Abs62
Дата сообщения: 19.05.2012 18:15
kenny5705

Цитата:
А что значит эта буква L

Она значит, что это константа не CHAR, а WCHAR. Два байта на каждый символ, а не один.

Цитата:
И в чем разница?

Разница в том, какие строки и какие функции используются. Той же функции CreateFile на самом деле не существует. Есть CreateFileA, которая работает со строками с однобайтовыми символами типа CHAR, и есть CreateFileW, которая работает с двухбайтовыми символами WCHAR. А CreateFile - это макрос, который при компиляции разворачивается либо в CreateFileA, либо в CreateFileW, в зависимости от того, определёно ли UNICODE. Примерно так:

Код: #ifdef UNICODE
#define CreateFile CreateFileW
#else
#define CreateFile CreateFileA
#endif
Автор: kenny5705
Дата сообщения: 19.05.2012 18:25

Цитата:
Она значит, что это константа не CHAR, а WCHAR. Два байта на каждый символ, а не один.

Понятно.

Цитата:
#ifdef UNICODE
#define CreateFile CreateFileW
#else
#define CreateFile CreateFileA
#endif

Где-то это видел уже. В общем в принципе суть уловил

А если использовать многобайтовую кодировку (Use Multi-Byte Character Set) в свойствах проекта, то никаких преобразований и приведений типов делать не приходиться, и вроде всё что нужно работает. Может на этом лучше остановиться?
Автор: Abs62
Дата сообщения: 19.05.2012 18:56
kenny5705

Цитата:
Может на этом лучше остановиться?

Тогда будут проблемы с некоторыми именами файлов. С теми, где есть символы, не входящие в однобайтовую системную кодировку.
Лучше сразу научиться правильно работать с юникодом. Тем более, что с уходом со сцены Win95/98/ME неюникодные программы по сути и не нужны.
Автор: ItsJustMe
Дата сообщения: 22.05.2012 02:34
Abs62

Цитата:
Вот так делать нельзя.

Вообще-то можно. Ибо никто пока этого законодательно не запретил. А даже, если и запретят, то в Росии все равно будет можно. Ибо в Росии на законы, как известно...
Другое дело, что прога с очень большой вероятностью упадет. Но это ведь не запрет, это всего лишь последствие гениальности программера. Так что делать так МОЖНО. Я разрешаю. Делайте на здоровье

Цитата:
Тем более, что с уходом со сцены Win95/98/ME неюникодные программы по сути и не нужны.

Если бы... Большинство сторонних библиотек до сих пор пишутся в ANSI. А каждый раз преобразовывать A<->W, чтобы строки, возвращенные WinAPI скормить этим кривым либам накладно. Вот и приходится Use Multi-Byte. Открыть бы этим либописателям Америку - что в мире есть такая штука, как Unicode. Или просто по голове настучать...
Автор: data man
Дата сообщения: 23.05.2012 16:14
kenny5705

Цитата:
Не помогло, подкинул w32api-3.17-2. Проблемка сохранилась, работает не со всей библиотекой winapi.

Можно попробовать взять отсюда. Там пополнее.
Автор: kenny5705
Дата сообщения: 23.05.2012 21:20

Цитата:
Тогда будут проблемы с некоторыми именами файлов.

Ну если я с файлами не работаю, то и проблем у меня не будет...
А так, поживем увидим, если что поменяем.


Цитата:
Так что делать так МОЖНО. Я разрешаю. Делайте на здоровье

Ну раз уж разрешаете, то пожалуй так и оставлю.


Цитата:
Можно попробовать взять отсюда. Там пополнее.

Да всё уже, решил отказаться от MiniGW GCC в пользу бесплатной VC2010, надеюсь в ней таких заморочек с отсутствием нужных функций winapi не будет.


Блин, ща бьюсь с получением PID/VID и GUID флешки, чет не могу не как в SetupApi этом разобраться.
В общем удалось получить след. инфу о накопителе:
VolumeMountPoint = I:\
Drive = \\.\PhysicalDrive2
DosDeviceName = \Device\Harddisk2\DP(1)0-0+5
Device Number = 5347371722473474
Cylinders/Heads/Sectors = 975 / 255 / 63
Bytes per sector = 512
CHS size = 8019648000 ( 7.47 Gb )
Total size = 8005918720 ( 7.46 Gb )
Free size on volume = 4759650304 ( 4.43 Gb )

Хочется получить GUID флешки, чтобы в дальнейшем провернуть с ней некоторые операции, в частности извлечение и обратное подключение.
Автор: Black_Lung
Дата сообщения: 27.09.2012 12:12
Есть простенькая програма которая делает автоустановку драйверов по hwid UpdateDriverForPlugAndPlayDevices
Бывает, на одном и том же компе и на одном и том же драйвере она выдоёт ошибку 800b0100, по гуглу нашел только это связано с подписями. Мне нужна более подробная информация по этой ошибке.
Автор: V0lt
Дата сообщения: 14.11.2012 19:30
Black_Lung
http://support.microsoft.com/kb/947821

Цитата:
0x800B0100     TRUST_E_NOSIGNATURE     В этом объекте нет подписи.
Автор: Black_Lung
Дата сообщения: 20.11.2012 10:38
Драйвер действительно неподписан, но проверка подписи отключена, система winxp. В ручную ставиться без вопросов, а нужно автоматически.
Автор: Asema
Дата сообщения: 07.04.2013 10:38
pomagite pojalusta tol'ko bystree
    Разработать программу, которая создает окно. Закрытие окна должно выполняться щелчком кнопки по значку разворачивания окна, при этом должно создаваться новое окно с таким же стилем. Однократный щелчок кнопки по значку закрытия не приводит к выполнению этого действия. Двойной щелчок по этому значку завершает работу программы.
cod v c++
Автор: wsadneg
Дата сообщения: 16.08.2013 16:47
Здравствуйте, товарищи программисты!
Я программирую микроконтроллеры, но вот судьба-злодейка заставляет засесть за winapi, нужно протестить несколько сишных функций на пк с представлением результатов в графическом виде. В общем столкнулся с проблемкой, часть информации вывожу в текстовом виде в WM_PAINT при помощи TextOut, примерно так:

Код:
case WM_PAINT:
    /* We receive WM_PAINT every time window is updated */
[часть пропущено]
    TextOut(hdc, 100, 200, szFile, wcslen(szFile));

Автор: ne_viens
Дата сообщения: 16.08.2013 18:27
//...
TextOut(hdc, 100, 200, szFile, wcslen(szFile));
ReleaseDC(hDlg, hdc);
return 1;

Err, так небудет перерисоваться при развороте из трея.
Рабочий вариант такой:
//...
    case WM_COMMAND:
        if(1001 == LOWORD(wParam))
        {
            GetClientRect(hDlg, &rect);
            InvalidateRect(hDlg, &rect, 0);            //send WM_PAINT
            return 1;
        }
        break;
    case WM_PAINT:
        hdc = GetDC(hDlg);
        GetClientRect(hDlg, &rect);
        FillRect(hdc, &rect, GetSysColorBrush(COLOR_MENU)); //COLOR_WINDOW
        SetBkMode(hdc, TRANSPARENT);
        TextOut(hdc, 5, 5, buf, wsprintf(buf, "0x%08x", __rdtsc()));
        ReleaseDC(hDlg, hdc);
        break;
//...
Автор: wsadneg
Дата сообщения: 16.08.2013 22:29
ne_viens, спасибки, не пойму правда зачем не нужен ReleaseDC, если у меня нет GetDC, но в общем с InvalidateRect всё прокатило.
Автор: ne_viens
Дата сообщения: 16.08.2013 22:43
А откуда hdc тогда взялся, от BeginPaint()? Тогда закрывающий EndPaint() нужен. Кстати именно эта комбинация рекомендуется под WM_PAINT, оказывается.
Автор: wsadneg
Дата сообщения: 17.08.2013 10:32
hdc от BeginPaint(), да (он был в стандартном хелловорде из которого я начал делать проект). EndPaint() там есть, просто я не полностью показал WM_PAINT. В общем я InvalidateRect в WM_COMMAND, где переменная меняется, теперь после изменения переменной нужный участок окна инвалидируется и надпись появляется сразу. Координаты прямоугольника пока вручную вбил, ну это я уже придумаю потом по месту как их вычислить.
Автор: V0lt
Дата сообщения: 04.08.2014 07:40
Подскажите пожалуйста.
Есть ли способ временно программно блокировать autoplay при вставлении CD/DVD?

Т.е. когда запущена моя программа, autoplay для конкретного диска не должен срабатывать. Если программу закрыли или прибили в диспетчере задач, то autoplay для этого диска должен вновь заработать.

Добавлено:
Разобрался.
http://msdn.microsoft.com/en-us/library/windows/desktop/cc144204%28v=vs.85%29.aspx
Автор: unreal666
Дата сообщения: 15.09.2014 12:08
какой winapi юзать для запуска исполняемого файла, чтобы при этом возвращался хэндл процесса (или что-то другое), по которому можно определить его PID и другие хар-ки?
ShellExecuteEx или есть еще какие-то?
Автор: MERCURY127
Дата сообщения: 15.09.2014 12:15
unreal666, CreateProcess возвращает PROCESS_INFORMATION structure, там эти хендлы есть
Автор: unreal666
Дата сообщения: 15.09.2014 14:28
MERCURY127
а можно полный пример использования CreateProcessW?
А то я там чего-то не понял как указывать некоторые параметры, к примеру, lpEnvironment.
Автор: akaGM
Дата сообщения: 15.09.2014 14:37
и найти совершенно нетрудно:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682425%28v=vs.85%29.aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682512%28v=vs.85%29.aspx

юникодный аналогично...
Автор: unreal666
Дата сообщения: 15.09.2014 14:43
akaGM
"CreateProcess function" я и так нашел, потому и спрашиваю (но вот ссылку на пример в нем не увидел).
А от примера толку нет, т.к. тот же параметр lpEnvironment там указан как NULL, т.е. не объяснен.
Автор: Abs62
Дата сообщения: 15.09.2014 15:35
unreal666

Цитата:
А от примера толку нет, т.к. тот же параметр lpEnvironment там указан как NULL, т.е. не объяснен.

А чего его объяснять особо? Обычный блок переменных окружения, последовательность сишных строк вида "имя=значение".
Автор: akaGM
Дата сообщения: 15.09.2014 15:37
unreal666


Цитата:
lpEnvironment [in, optional]

A pointer to the environment block for the new process. If this parameter is NULL, the new process uses the environment of the calling process.

An environment block consists of a null-terminated block of null-terminated strings. Each string is in the following form:

name=value\0

Because the equal sign is used as a separator, it must not be used in the name of an environment variable.

An environment block can contain either Unicode or ANSI characters. If the environment block pointed to by lpEnvironment contains Unicode characters, be sure that dwCreationFlags includes CREATE_UNICODE_ENVIRONMENT. If this parameter is NULL and the environment block of the parent process contains Unicode characters, you must also ensure that dwCreationFlags includes CREATE_UNICODE_ENVIRONMENT.

The ANSI version of this function, CreateProcessA fails if the total size of the environment block for the process exceeds 32,767 characters.

Note that an ANSI environment block is terminated by two zero bytes: one for the last string, one more to terminate the block. A Unicode environment block is terminated by four zero bytes: two for the last string, two more to terminate the block.
что здесь непонятного?

Добавлено:

Abs62

о!
привет :)
Автор: unreal666
Дата сообщения: 15.09.2014 17:55
akaGM

Цитата:
что здесь непонятного?

этот блок непонятен:

Цитата:
An environment block consists of a null-terminated block of null-terminated strings. Each string is in the following form:

name=value\0

value - это что? null-терминированная строка? Если нет (т.е. null-терминированной строкой является полностью выражение value\0), то тогда непонятки с юникодом, т.е. его (юникода) строка оканчивается на \0\0.
+ null-терминированный блок - оканчивается всегда на \0 или для юникода \0\0 ?
и т.п.
Автор: akaGM
Дата сообщения: 15.09.2014 18:34
unreal666

ты под виндой?

заряди

C:>set > filename.txt
а потом содержимое файла представь в виде нультерм строк...

да на фиг тебе это надо, ты собираешься переменные среды динамически менять?
в 95% случаем можно положиться на родителя с lpEnvironmen = NULL
Автор: unreal666
Дата сообщения: 15.09.2014 18:41

Цитата:
а потом содержимое файла представь в виде нультерм строк...

LPCTSTR-строк? А блок (null-terminated block) чем заканчивать для CreateProcessW? \0 или \0\0?

Цитата:
да на фиг тебе это надо, ты собираешься переменные среды динамически менять?

А вдруг. Да и привык сразу для общих случаев делать "заготовки".
Автор: PaNov
Дата сообщения: 03.05.2015 12:24
появилось несколько вопросов:

- как определить что некоторый диск подключен при помощи утилиты subst?
- как подключить/отключить при помощи winapi диск, аналогично тому как это делает утилита subst?
Автор: ne_viens
Дата сообщения: 03.05.2015 12:59
1. QueryDosDevice("S:", buf, sizeof(buf)); //buf=\Device\HarddiskVolume1 vs buf=\??\C:\www
2. DefineDosDevice(0, "S:", "C:\\www"); , DefineDosDevice(DDD_REMOVE_DEFINITION, "S:", NULL);

Страницы: 12345678910111213141516171819202122232425262728293031323334353637

Предыдущая тема: посоветуйте книги по SQL


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.