Winapi

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

o4en1 krutoi

#1
прочитал книгу создал проект скопировал текст
#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'

вчем дело
 

MaXXX

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

@LE}{@NDER

#3
прочитал книгу создал проект скопировал текст
#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

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

@LE}{@NDER

#5
дело в юникодах. Измени в настройках проекта:
project->properties->"configuration properties"->general и там найди "character set" и измени "use unicode character set" на "not set". Я вот так делаю, а может кто-то скажет про возможные последствия?
Последствия возможны, если в один прекрасный день придется перевести прогу для работы в юникоде, напаришься до посинения. :)
 
M

misterio

#6
Тогда встречный вопрос : в компиляторе 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

#7
Ругаеться, мол error C3861: '_T': identifier not found. Почему? И как научить понимать компилятор?
Ответ на вопрос уже прозвучал - читать внимательно надо.
Если _UNICODE определен, _TEXT определяется как: #define _TEXT(x) L ## x В ином случае _TEXT определяется следующим образом: #define _TEXT(x) x
Другими словами, скорее всего в настройках проекта был отключен юникод, соответственно и макрос TEXT не определен. Чудес не бывает, для каждого следствия есть причина, даже если она не очевидна.