OutputDebugString int в win32

Я новичок в win32 API, и в рамках своего обучения я хочу распечатать координаты моей мыши (LOWORD (lParam), HIWORD (lParam)). Как я могу это сделать? OutputDebugString получает только значение LPCWSTR, поэтому мне нужно преобразовать в него int? или есть лучший способ сделать это?


person Omi Kor    schedule 28.12.2020    source источник
comment
Windows с C++ - Использование Printf с современным C++. Ключевой вывод: ваша проблема не связана с OutputDebugStringW.   -  person IInspectable    schedule 28.12.2020
comment
Проблема в том, что я не вижу printf, потому что нахожусь в SUBSYSTEM:WINDOWS, так как мне просмотреть printf?   -  person Omi Kor    schedule 28.12.2020
comment
Вы можете использовать SUBSYSTEM:CONSOLE с приложением с графическим интерфейсом. Я часто делаю это в режиме отладки для своих приложений Qt, но отключил его в выпуске. С учетом сказанного вам может понадобиться int main() вместо WinMain, я не помню, чтобы я не делал winapi напрямую в течение 2 десятилетий.   -  person drescherjm    schedule 28.12.2020
comment
У меня есть старый ответ, который может помочь: https://stackoverflow.com/questions/13840942/visual-studio-2012-c-standard-output/13841522#13841522   -  person drescherjm    schedule 28.12.2020
comment
Похоже, вы не только новичок в Windows API, но и в C (и C++). Отсюда мой комментарий. Вы printf заходите в буфер памяти, используя vsprintf семейство функций.   -  person IInspectable    schedule 28.12.2020
comment
@IInspectable, это способ C подойти к этому. Способ С++ заключается в использовании вместо этого std::ostringstream.   -  person Remy Lebeau    schedule 28.12.2020
comment
@rem Это совершенно неразумный способ С++. Разумный (-иш) способ С++ - это std::format.   -  person IInspectable    schedule 28.12.2020
comment
Не принимая во внимание дебаты о C и C++, эти макросы отчета об отладке, доступные для компилятора Microsoft Visual C++, предназначены для помощи в тех вещах, для которых некоторые люди используют OutputDebugString, если мне не изменяет память - я просто пришел сюда, чтобы поделиться ссылкой. Я открыт для того, чтобы оказаться неправым. Причина, по которой я не хочу углубляться в этот C или этот C++, заключается в том, что мы должны признать иронию, заключающуюся в том, что компилятор Microsoft Visual C++ взаимодействует с WinAPI, написанным на C.   -  person amn    schedule 25.02.2021


Ответы (1)


OutputDebugString умеет только отправлять текстовые строки в отладчик.

OutputDebugString("This works because this is a string.\n");
int x = GetMouseXCoordinate();
OutputDebugString(x);  // This doesn't work because x isn't a string.

Если вы хотите напечатать что-то, что еще не является текстовой строкой, вам сначала нужно создать строку с текстовым представлением, а затем отправить ее на OutputDebugString.

int x = GetMouseXCoordinate();
// Here's a method commonly used in C and C++ to format the value yourself.
char message[63];
sprintf(message, "%d", x);
OutputDebugString(message);

Существуют альтернативы (например, использование itoa, std::stringstream, более безопасных версий sprintf и т. д.). Несмотря на это, это может быть громоздко, если вы хотите отправить много сообщений в окно вывода отладчика. Многие из сообщений, связанных в комментариях к вашему вопросу, представляют собой способы изолировать этап форматирования с помощью макросов препроцессора, перегрузок функций С++ или шаблонов. Все эти решения имеют компромиссы.

Мое личное решение состоит в том, чтобы вывести свой собственный тип буфера потока из std::basic_streambuf и переопределить пару его виртуальных методов, чтобы направить вывод на подключенный отладчик. Затем я создаю экземпляр выходного потока с именем dbg, который использует мой строковый буфер. Итак, когда я хочу вывести в окно отладки, я просто использую вывод в формате C++:

dbg << "Mouse coordinates: " << x << ", " << y << std::endl;

В релизных сборках dbg — это фиктивный класс, который ничего не делает, а оптимизатор достаточно умен, чтобы не утруждать себя созданием какого-либо кода форматирования и вывода.

person Adrian McCarthy    schedule 28.12.2020