Lpctstr
Но вот недавно столкнулся с большими трудностями, а именно: никак не могу разобраться с типом LPCTSTR, и поэтому никак не получаецца даже примитивный MessageBox вывести на чистом WinAPI :( Согласно MSDN тип данных LPCTSTR есть ни что иное как "Pointer to a null-terminated string", но если я просто напишу, например, так:
char* str="something";
LPCTSTR s;
s=str;
то компилер выплюнет ошибку
Error 1 error C2440: '=' : cannot convert from 'char *' to 'LPCTSTR' d:\my documents\visual studio 2005\projects\opengl+api\opengl+api\main_code.cpp 7
Как исправить это? Может кто знает как можн на чистом АПИ вывети MessageBox и создать окно, мож у кого есть готовый пример?
Заранее благодарен за помощь!
Это всё легко исправить при создании проекта снять значение использовать юникод.
или делать так
::MessageBox(NULL,_T("Test"),_T("Test"),MB_OK);
::MessageBox(NULL,L"Test",L"Test",MB_OK);
либо так
char* str="something";
::MessageBox(NULL,CComBSTR(str),L"Test",MB_OK);
или так
BSTR pWChar = L"TEST";
::MessageBox(NULL,pWChar,L"Test",MB_OK);
а можно так :)
char* pStr = "Test";
BSTR Bstr = SysAllocStringByteLen(pStr,strlen(pStr));
::MessageBox(NULL,Bstr,L"Test",MB_OK);
и так далее.
А на счёт создания окна создай в студии
простой проект Win32 Project,а там уже студия
сама пропишет простенький код по созданию окна.
Здравстуйте, уважаемые! Недавно пересел с Билдера на Visual C++ 2005 и осознал всю мощь этого замечательного средства разработки.
Но вот недавно столкнулся с большими трудностями, а именно: никак не могу разобраться с типом LPCTSTR, и поэтому никак не получаецца даже примитивный MessageBox вывести на чистом WinAPI :( Согласно MSDN тип данных LPCTSTR есть ни что иное как "Pointer to a null-terminated string", но если я просто напишу, например, так:
char* str="something";
LPCTSTR s;
s=str;
то компилер выплюнет ошибку
Error 1 error C2440: '=' : cannot convert from 'char *' to 'LPCTSTR' d:\my documents\visual studio 2005\projects\opengl+api\opengl+api\main_code.cpp 7
Как исправить это? Может кто знает как можн на чистом АПИ вывети MessageBox и создать окно, мож у кого есть готовый пример?
Заранее благодарен за помощь!
LPCSTR это Long Pointer на const и определен так
"#ifdef UNICODE
typedef LPWSTR LPTSTR; // LPTSTR is synonym for LPWSTR under Unicode
typedef LPCWSTR LPCTSTR; // LPCTSTR is synonym for LPCWSTR under Unicode
#else
typedef LPSTR LPTSTR; // LPTSTR is synonym for LPSTR under ANSI
typedef LPCSTR LPCTSTR; // LPTCSTR is synonym for LPCSTR under ANSI
#endif
"
Нужен просто casting и писать нужно так:
LPCTSTR s;
s=(LPCTSTR)str;
или так
Нужен просто casting и писать нужно так:
LPCTSTR s;
s=(LPCTSTR)str;
или так
Так нельзя, если приложение уникодное, то будет каша...
Правильнее будет так:
char *str = "something";
LPCTSTR s = A2T(str);
а лучше всего сразу так:
но надежней так: :)
или даже так :D:
:D :D
Здравстуйте, уважаемые! Недавно пересел с Билдера на Visual C++ 2005 и осознал всю мощь этого замечательного средства разработки.
Но вот недавно столкнулся с большими трудностями, а именно: никак не могу разобраться с типом LPCTSTR, и поэтому никак не получаецца даже примитивный MessageBox вывести на чистом WinAPI :( Согласно MSDN тип данных LPCTSTR есть ни что иное как "Pointer to a null-terminated string", но если я просто напишу, например, так:
char* str="something";
LPCTSTR s;
s=str;
то компилер выплюнет ошибку
Error 1 error C2440: '=' : cannot convert from 'char *' to 'LPCTSTR' d:\my documents\visual studio 2005\projects\opengl+api\opengl+api\main_code.cpp 7
Как исправить это? Может кто знает как можн на чистом АПИ вывети MessageBox и создать окно, мож у кого есть готовый пример?
Заранее благодарен за помощь!
Господа хорошие, дело то не в том, что VC++ по умолчанию на Unicode настроен (кстати, это вовсе не так. Я работаю в VC++ 7 и там #define _UNICODE нужно писать самому). LPCTSTR = это const TCHAR * !!! Конечно, компилятор не даёт произвести конверсию, т. к. указатель-то изменяться не должен, он же объявлен как постоянный (неизменяемый). Нужно писать LPTSTR вместо LPCTSTR там, где планируешь изменять указатель или косвенное значение, связанное с этим указателем:
LPTSTR p = tsz
Господа хорошие, дело то не в том, что VC++ по умолчанию на Unicode настроен (кстати, это вовсе не так. Я работаю в VC++ 7 и там #define _UNICODE нужно писать самому). LPCTSTR = это const TCHAR * !!! Конечно, компилятор не даёт произвести конверсию, т. к. указатель-то изменяться не должен, он же объявлен как постоянный (неизменяемый). Нужно писать LPTSTR вместо LPCTSTR там, где планируешь изменять указатель или косвенное значение, связанное с этим указателем:
LPTSTR p = tsz
:)
Именно поэтому я писал
а не
str = _T("something");
Господа хорошие, дело то не в том, что VC++ по умолчанию на Unicode настроен (кстати, это вовсе не так. Я работаю в VC++ 7 и там #define _UNICODE нужно писать самому). LPCTSTR = это const TCHAR * !!! Конечно, компилятор не даёт произвести конверсию, т. к. указатель-то изменяться не должен, он же объявлен как постоянный (неизменяемый). Нужно писать LPTSTR вместо LPCTSTR там, где планируешь изменять указатель или косвенное значение, связанное с этим указателем:
LPTSTR p = tsz
А по мойму дело как раз в юникоде, так как это в 7 надо самому прописывать, в Visual C++ 2005 юникод включён по умолчанию.
И по всей видимости человек столкнулся именно с данной проблемой.
А по мойму дело как раз в юникоде, так как это в 7 надо самому прописывать.
Ну да, все верно, в свойсвах проекта нужно выбирать... и автоматом в зависимости от того что выбрал делается #define _UNICODE или не делается....
Для этого и существует TCHAR, который в зависимости от этого дефайна имеет определенный тип...
Т.е. чтобы приложение стало уникодным (или наоборот) нужно только поменять свойства проекта и все! Поэтому и надо повсмеместно использовать макросы _T() и тому подобную хрень при работе со строками...
Употребление const ИМХО является хорошим стилем программирования
А вообще ИМХО с текстом( и не только стекстом ) лучше работать на уровне классов и тогда проблемы с UNICODE отпадут почти автоматически.