2015-04-28 7 views
-3

Я новичок на этом сайте, поэтому, если я получу что-то не так в своем первом посте, пожалуйста, не беспокойтесь на меня так сильно.wsprintf() сбой моего приложения

Здесь не идет ничего ...

В моем приложении, у меня есть следующий код:

wsprintf(hardware_info, "%ul+%ul", dwGPU, dwCPU);

hardware_info хранится как LPSTR и передается по ссылке в качестве параметра для функция, которая содержит следующую строку (например void do_something(IN LPSTR out){})

dwGPU и dwCPU явно DWORD или ul, unsigned long.

Когда это приложение выполнено, оно сработает сразу после выполнения вышеуказанной строки кода (обратите внимание, что эта строка не проходит). Может кто-нибудь объяснить мне, в чем проблема?

EDIT:

Я исправил проблему. Я считаю, что это была скорее логическая ошибка. Я смутил %ul, поскольку я думал, что он стоял за unsigned long, хотя через некоторые исследования я узнал, что это действительно %lu, как ни странно.

Благодаря тому, кто внес свой вклад в это, это действительно помогло мне разобраться.

+0

Как объявляется 'hardware_info'? Как вы распределяете память для целевого буфера? – AnT

+0

Я думаю, что я выделил достаточно, предполагая, что максимально возможная длина буфера составляет 64 байта. Я использовал 'memset (hardware_info, 0, 4096);', а затем 'realloc()' '4096 - sizeof (hardware_info)' после заполнения буфера. Я перемещаю это выделение в конец буфера, а затем использую некоторую логику сборки для хранения текущего буфера в недавно выделенный фрейм. Поэтому я не думаю, что это проблема здесь ... Кроме того, я не могу поверить, сколько троллей существует в stackoverflow. Я намеренно говорю «Im new здесь, успокойся на мне», а через несколько секунд я получаю -3 rep по моему первому вопросу ». –

+0

Вы много описываете, но на самом деле не показываете нам код, который выделяет это пространство Для этого просто объявите 'hardware_info' простым буфером буфера, который содержит 1000 символов, - нет фантастической логики, чтобы выяснить, насколько это возможно. Если вы это сделали, произойдет сбой программы ? – PaulMcKenzie

ответ

1

Ну, во-первых, если ваш hardware_info - LPSTR, то почему вы используете wsprintf? wsprintf для LPTSTR. LPSTR - это «обычный» указатель на символ, который должен работать с sprintf. Ваша строка формата также является обычной строкой, которая должна работать с sprintf. Ваш код будет компилироваться и работать как есть (т. Е. С wsprintf), если проект настроен для узкосимвольных строк, но при этом здесь нет никакой логики при использовании wsprintf.

Во-вторых, я бы предположил, что вам не удалось выделить память для вашего hardware_info или не выделил достаточно. Это может привести к сбою вашего кода.

+0

'sprintf()' не делает разница, он все еще падает. И так как каждый пытается действовать как такая умная задница здесь ... Если вы посмотрите ближе на концы WinAPI. Это похоже на «typedef LPSTR LPTSTR». Поэтому, пожалуйста, не важно, использую ли я 'wsprintf()' или 'sprintf()'. Хотя, спасибо за попытку, я бы хотел получить реальный ответ от кого-то другого, кто-нибудь? –

+0

Также, чтобы добавить к комментарию выше. 'typedef LPSTR LPTSTR' и' typedef CHAR * LPSTR'. Поэтому https://msdn.microsoft.com/en-us/library/windows/desktop/ms647550%28v=vs.85%29.aspxx (обратитесь к первому прототипу). 'sprintf()' принимает 'typedef char * PCHAR' в качестве первого параметра. Поэтому использование LPTSTR в качестве параметра для этой функции такое же, как https://msdn.microsoft.com/en-us/library/ce3zzk1k.aspx –

+0

'И так как каждый пытается действовать как такая умная задница здесь ...' I не вижу ничего плохого в том, как вам был дан ответ. Я думаю, вам нужно немного успокоиться. – PaulMcKenzie

Смежные вопросы