Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Lpctstr

11K
12 марта 2006 года
coder_in_law
11 / / 19.10.2005
Здравстуйте, уважаемые! Недавно пересел с Билдера на 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 и создать окно, мож у кого есть готовый пример?
Заранее благодарен за помощь!
2.2K
13 марта 2006 года
REFOT
181 / / 08.04.2005
Visual C++ 2005 по умолчанию настроено на использование юникода.
Это всё легко исправить при создании проекта снять значение использовать юникод.
или делать так
::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,а там уже студия
сама пропишет простенький код по созданию окна.
2.4K
13 марта 2006 года
dinasok51
219 / / 12.11.2005
Цитата:
Originally posted by coder_in_law
Здравстуйте, уважаемые! Недавно пересел с Билдера на 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 и писать нужно так:

 
Код:
char* str="something";
    LPCTSTR s;
    s=(LPCTSTR)str;

или так
 
Код:
s=reinterpret_cast<LPCTSTR>(str);
395
13 марта 2006 года
RelB
367 / / 09.11.2002
Цитата:
Originally posted by dinasok51

Нужен просто casting и писать нужно так:

 
Код:
char* str="something";
    LPCTSTR s;
    s=(LPCTSTR)str;

или так
 
Код:
s=reinterpret_cast<LPCTSTR>(str);


Так нельзя, если приложение уникодное, то будет каша...
Правильнее будет так:

 
Код:
USES_CONVERSION;
   char *str = "something";
   LPCTSTR s = A2T(str);

а лучше всего сразу так:
 
Код:
LPCTSTR str = _T("something");

но надежней так: :)
 
Код:
CString s = _T("something");

или даже так :D:
 
Код:
CString s = "something";



:D :D
534
13 марта 2006 года
HarryAxe
448 / / 19.01.2006
Цитата:
Originally posted by coder_in_law
Здравстуйте, уважаемые! Недавно пересел с Билдера на 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 там, где планируешь изменять указатель или косвенное значение, связанное с этим указателем:

 
Код:
TCHAR tsz[] = TEXT("Something");
LPTSTR p = tsz
тогда всё будет OK
395
13 марта 2006 года
RelB
367 / / 09.11.2002
Цитата:
Originally posted by HarryAxe
Господа хорошие, дело то не в том, что VC++ по умолчанию на Unicode настроен (кстати, это вовсе не так. Я работаю в VC++ 7 и там #define _UNICODE нужно писать самому). LPCTSTR = это const TCHAR * !!! Конечно, компилятор не даёт произвести конверсию, т. к. указатель-то изменяться не должен, он же объявлен как постоянный (неизменяемый). Нужно писать LPTSTR вместо LPCTSTR там, где планируешь изменять указатель или косвенное значение, связанное с этим указателем:
 
Код:
TCHAR tsz[] = TEXT("Something");
LPTSTR p = tsz
тогда всё будет OK


:)
Именно поэтому я писал

 
Код:
LPCTSTR str = _T("something");

а не
 
Код:
LPCTSTR str;
str = _T("something");
2.2K
13 марта 2006 года
REFOT
181 / / 08.04.2005
Цитата:
Originally posted by HarryAxe
Господа хорошие, дело то не в том, что VC++ по умолчанию на Unicode настроен (кстати, это вовсе не так. Я работаю в VC++ 7 и там #define _UNICODE нужно писать самому). LPCTSTR = это const TCHAR * !!! Конечно, компилятор не даёт произвести конверсию, т. к. указатель-то изменяться не должен, он же объявлен как постоянный (неизменяемый). Нужно писать LPTSTR вместо LPCTSTR там, где планируешь изменять указатель или косвенное значение, связанное с этим указателем:
 
Код:
TCHAR tsz[] = TEXT("Something");
LPTSTR p = tsz
тогда всё будет OK



А по мойму дело как раз в юникоде, так как это в 7 надо самому прописывать, в Visual C++ 2005 юникод включён по умолчанию.
И по всей видимости человек столкнулся именно с данной проблемой.

395
13 марта 2006 года
RelB
367 / / 09.11.2002
Цитата:
Originally posted by REFOT
А по мойму дело как раз в юникоде, так как это в 7 надо самому прописывать.


Ну да, все верно, в свойсвах проекта нужно выбирать... и автоматом в зависимости от того что выбрал делается #define _UNICODE или не делается....

Для этого и существует TCHAR, который в зависимости от этого дефайна имеет определенный тип...

Т.е. чтобы приложение стало уникодным (или наоборот) нужно только поменять свойства проекта и все! Поэтому и надо повсмеместно использовать макросы _T() и тому подобную хрень при работе со строками...

2.4K
13 марта 2006 года
dinasok51
219 / / 12.11.2005
Изначальная ошибка из-за несовместимости указателей: char* и const char*

Употребление const ИМХО является хорошим стилем программирования

А вообще ИМХО с текстом( и не только стекстом ) лучше работать на уровне классов и тогда проблемы с UNICODE отпадут почти автоматически.
11K
19 марта 2006 года
coder_in_law
11 / / 19.10.2005
Огромное человеческое спасибо за помощь, уважаемые! Если ещё будут какие траблы - обязательно обращусь! Спасибо огромное!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог