• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Winapi

  • Автор темы o4en1 krutoi
  • Дата начала
O

o4en1 krutoi

прочитал книгу создал проект скопировал текст
#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
MessageBox(NULL, "Hello, Win32 world!", "Hello from Message Box", MB_OK);
return 0;
}
получается вот такая ошибка
d:\my progs\hello\hello\hellofrommsgbox.cpp(6) : error C2664: 'MessageBoxW' : cannot convert parameter 2 from 'const char [20]' to 'LPCWSTR'

вчем дело
 
M

MaXXX

Книги в основном написаны для старых версий Visual C++, сделай то же самое в 6 версии и все получится )) Или используй функцию MessageBoxA вместо MessageBox.
 
@

@LE}{@NDER

прочитал книгу создал проект скопировал текст
#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
MessageBox(NULL, "Hello, Win32 world!", "Hello from Message Box", MB_OK);
return 0;
}
получается вот такая ошибка
d:\my progs\hello\hello\hellofrommsgbox.cpp(6) : error C2664: 'MessageBoxW' : cannot convert parameter 2 from 'const char [20]' to 'LPCWSTR'

вчем дело

Тут всего навсего достаточно использовать макрос _T или _TEXT. Назначение этих макросов, грубо говоря, - в зависимости от макроса UNICODE делать ASCII или юникодные строки.

Пояснение можно найти у Рихтера:
TCHAR *szError = L"Error";
Заглавная буква L перед строковым литералом указывает компилятору, что его надо обрабатывать как Unicode-строку. Тогда, размещая строку в области данных программы, компилятор вставит между всеми символами нулевые байты. Но возникает другая проблема — программа компилируется, только если _UNICODE определен. Следовательно, нужен макрос, способный избирательно ставить L перед строковым литералом. Эту работу выполняет макрос _TEXT (или _Т), также содержащийся в Tchar.h. Если _UNICODE определен, _TEXT определяется как: #define _TEXT(x) L ## x В ином случае _TEXT определяется следующим образом: #define _TEXT(x) x


Этот код будет работать:
Код:
#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
LPSTR lpCmdLine, int nCmdShow)
{
MessageBox(NULL, _T("Hello, Win32 world!"), _T("Hello from Message Box"), MB_OK);
return 0;
}
 
G

Guest

Можно еще так замутить:
CHAR lp1[30]="Hello, Win32 world!\0";
CHAR lp2[30]="Hello from Message Box\0";
MessageBox(NULL, lp1, lp2, MB_OK);
 
@

@LE}{@NDER

дело в юникодах. Измени в настройках проекта:
project->properties->"configuration properties"->general и там найди "character set" и измени "use unicode character set" на "not set". Я вот так делаю, а может кто-то скажет про возможные последствия?

Последствия возможны, если в один прекрасный день придется перевести прогу для работы в юникоде, напаришься до посинения. :)
 
M

misterio

Тогда встречный вопрос : в компиляторе VC++ 2008 Express Edition

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
MessageBox(NULL, "Hello, Win32 world!", "Hello from Message Box", MB_OK);
return 0;
}

Прекрасно компилируется независимо от символов - русские/английские.
А вот на это :

Код:
#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
LPSTR lpCmdLine, int nCmdShow)
{
MessageBox(NULL, _T("Hello, Win32 world!"), _T("Hello from Message Box"), MB_OK);
return 0;
}

Ругаеться, мол error C3861: '_T': identifier not found. Почему? И как научить понимать компилятор?

-----------------------
А..всё я разобрался!
 
@

@LE}{@NDER

Ругаеться, мол error C3861: '_T': identifier not found. Почему? И как научить понимать компилятор?

Ответ на вопрос уже прозвучал - читать внимательно надо.
Если _UNICODE определен, _TEXT определяется как: #define _TEXT(x) L ## x В ином случае _TEXT определяется следующим образом: #define _TEXT(x) x
Другими словами, скорее всего в настройках проекта был отключен юникод, соответственно и макрос TEXT не определен. Чудес не бывает, для каждого следствия есть причина, даже если она не очевидна.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!