Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.97/104: Рейтинг темы: голосов - 104, средняя оценка - 4.97
1 / 1 / 0
Регистрация: 16.07.2009
Сообщений: 29
1

Невозможно преобразовать параметр из 'const char [7]' в 'LPCTSTR'

16.07.2009, 08:54. Показов 19624. Ответов 13
Метки нет (Все метки)

Здравствуйте!
Я совсем недавно начал изучать С++. По большей степени ничего пока не знаю , но очень хочется как можно быстрее изучить хотя бы не совсем сложное.
Установив Visual Studio 2008 (русскую версию), я попробовал написать свою первую программу. Знакомые мне дали видео учебник по С++, и я при написании строго придерживался его.
Причем, обшибки возникли сразу (на первом уроке учебника). В видео уроках не происходило никаких ошибок, а у меня в программе - постоянно. Я пробовал на нескольких компьютерах - такая же история.
Говоря конкретнее, я хотел написать для начала MFC - приложение на базе диалоговых окон, которое бы при нажатие на соответствующую кнопку выдавало сообщение "Привет". Пожалуйста, не думайте обо мне, как о полном ламере, потому что я совсем недавно стал изучать этот язык программирования, а над этой проблеммой думаю уже недели две.

Итак, вот мой код:


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
 // HeiDlg.cpp : файл реализации
//
 
#include "stdafx.h"
#include "Hei.h"
#include "HeiDlg.h"
 
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
 
 
// Диалоговое окно CAboutDlg используется для описания сведений о приложении
 
class CAboutDlg : public CDialog
{
public:
    CAboutDlg();
 
// Данные диалогового окна
    enum { IDD = IDD_ABOUTBOX };
 
    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // поддержка DDX/DDV
 
// Реализация
protected:
    DECLARE_MESSAGE_MAP()
};
 
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}
 
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
}
 
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()
 
 
// диалоговое окно CHeiDlg
 
 
 
 
CHeiDlg::CHeiDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CHeiDlg::IDD, pParent)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
 
void CHeiDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
}
 
BEGIN_MESSAGE_MAP(CHeiDlg, CDialog)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    //}}AFX_MSG_MAP
    ON_BN_DOUBLECLICKED(IDC_BUTTON1, &CHeiDlg::OnBnDoubleclickedButton1)
END_MESSAGE_MAP()
 
 
// обработчики сообщений CHeiDlg
 
BOOL CHeiDlg::OnInitDialog()
{
    CDialog::OnInitDialog();
 
    // Добавление пункта ''О программе...'' в системное меню.
 
    // IDM_ABOUTBOX должен быть в пределах системной команды.
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);
 
    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
        CString strAboutMenu;
        strAboutMenu.LoadString(IDS_ABOUTBOX);
        if (!strAboutMenu.IsEmpty())
        {
            pSysMenu->AppendMenu(MF_SEPARATOR);
            pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
        }
    }
 
    // Задает значок для этого диалогового окна. Среда делает это автоматически,
    //  если главное окно приложения не является диалоговым
    SetIcon(m_hIcon, TRUE);         // Крупный значок
    SetIcon(m_hIcon, FALSE);        // Мелкий значок
 
    // TODO: добавьте дополнительную инициализацию
 
    return TRUE;  // возврат значения TRUE, если фокус не передан элементу управления
}
 
void CHeiDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
        CAboutDlg dlgAbout;
        dlgAbout.DoModal();
    }
    else
    {
        CDialog::OnSysCommand(nID, lParam);
    }
}
 
// При добавлении кнопки свертывания в диалоговое окно нужно воспользоваться приведенным ниже кодом,
//  чтобы нарисовать значок. Для приложений MFC, использующих модель документов или представлений,
//  это автоматически выполняется рабочей средой.
 
void CHeiDlg::OnPaint()
{
    if (IsIconic())
    {
        CPaintDC dc(this); // контекст устройства для рисования
 
        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
 
        // Выравнивание значка по центру клиентского прямоугольника
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;
 
        // Нарисуйте значок
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
        CDialog::OnPaint();
    }
}
 
// Система вызывает эту функцию для получения отображения курсора при перемещении
//  свернутого окна.
HCURSOR CHeiDlg::OnQueryDragIcon()
{
    return static_cast<HCURSOR>(m_hIcon);
}
 
 
void CHeiDlg::OnBnDoubleclickedButton1()
{
    MessageBox("Привет");
}
При его компиляции у меня на разных машинах возникали 2 рода ошибок. [LIST=1][*]компиляция завершалась с ошибками. Выдавалось сообщение:
1>Компиляция...
1>HeiDlg.cpp
1>i:\_temp\new\hei\hei\heidlg.cpp(155) : error C2664: CWnd::MessageBoxW: невозможно преобразовать параметр 1 из 'const char [7]' в 'LPCTSTR'
1> Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции"

В этом случае выдавалось при исполнении программы окошко, но кнопка "Привет" не функционировала.
  1. (см. вложенный скриншот) Кнопки "Привет" вообще на окошке не было.
Подскажите, пожалуйста, в чем могла бы быть моя ошибка? Заранее благодарен.
Миниатюры
Невозможно преобразовать параметр из 'const char [7]' в 'LPCTSTR'  
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.07.2009, 08:54
Ответы с готовыми решениями:

Ошибка 1 error C2664: CFileFind::FindFile: невозможно преобразовать параметр 1 из 'const char [7]' в 'LPCTSTR'
Нужно вывести на экран, в консольном режиме имена всех файлов, которые находятся в какой-то...

Невозможно преобразовать параметр 1 из 'const char [3]' в 'const wchar_t *
void CprojectDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { // TODO: добавьте...

Невозможно преобразовать параметр 2 из 'char' в 'const char *
Уважаемые господа программисты,как преобразовать тип переменной из 'char' в 'const char *'? ...

WinAPI - Невозможно преобразовать параметр из 'const char [26]' в 'LPCWSTR'
Здравствуйте!! Начал немного изучать WinAPI!! и тут возникла проблемка &quot;Невозможно...

13
1 / 1 / 0
Регистрация: 16.07.2009
Сообщений: 29
16.07.2009, 10:12  [ТС] 2
При его компиляции у меня на разных машинах возникали 2 рода ошибок.

1 ошибка:
компиляция завершалась с ошибками. Выдавалось сообщение:
1>Компиляция...
1>HeiDlg.cpp
1>i:\_temp\new\hei\hei\heidlg.cpp(155) : error C2664: CWnd::MessageBoxW: невозможно преобразовать параметр 1 из 'const char [7]' в 'LPCTSTR'
1> Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции"
В этом случае выдавалось при исполнении программы окошко, но кнопка "Привет" не функционировала.

2 ошибка:
(см. вложенный скриншот) Кнопки "Привет" вообще на окошке не было.
1
589 / 356 / 15
Регистрация: 06.02.2009
Сообщений: 1,386
16.07.2009, 10:25 3
Цитата Сообщение от maximus2107 Посмотреть сообщение
C++
1
2
3
4
void CHeiDlg::OnBnDoubleclickedButton1() 
{         
MessageBox("Привет"); 
}
Это должно быть так
C++
1
MessageBox(L"Привет");
3
1 / 1 / 0
Регистрация: 16.07.2009
Сообщений: 29
16.07.2009, 10:45  [ТС] 4
Спасибо!
И тогда вот какой вопрос: это, получается, новая спецификация в 2008 визуал студии? Так как в учебнике рассматривалась 2005 версия, там этого не было?
То есть, такое в каждом теперь выводимом сообщении должно быть?
0
589 / 356 / 15
Регистрация: 06.02.2009
Сообщений: 1,386
16.07.2009, 11:43 5
Цитата Сообщение от maximus2107 Посмотреть сообщение
То есть, такое в каждом теперь выводимом сообщении должно быть?
Да, в каждом сообщение и надписи.

Цитата Сообщение от maximus2107 Посмотреть сообщение
это, получается, новая спецификация в 2008 визуал студии?
Это спецификация WinAPI
1
229 / 67 / 11
Регистрация: 02.06.2009
Сообщений: 280
16.07.2009, 13:31 6
L"Privet" - wide-char строка
Не хочеш писать L - Project-properties-general-character set: use multi-byte character set.
2
42 / 42 / 4
Регистрация: 14.09.2008
Сообщений: 683
16.07.2009, 13:39 7
Ну как видишь
MessageBoxW: невозможно преобразовать параметр 1 из 'const char [7]' в 'LPCTSTR'
У тебя получился тип char[7], а функция принимает параметр типа LPCTSTR(Long PointerCSTR). Соответственно типы разные и оно само их не приводит.
Для этого на будущее приводи типы в ручную при помощи
C++
1
(type)
Тоесть MessageBox((LPCSTR)"Hello");
или
double a=1.777;
int b = (int)a;
В общем идея ясна. Ну а для удобства сделали такие спецификатор как тебе сказали "L - Long).
2
2826 / 1635 / 252
Регистрация: 03.12.2007
Сообщений: 4,222
16.07.2009, 14:11 8
Цитата Сообщение от TGrey[WoLf] Посмотреть сообщение
Тоесть MessageBox((LPCSTR)"Hello");
Если было LPCSTR, то вроде незачем, а если LPCWSTR, то строка не изменится, только указатель будет другого типа, или я что-то не понял?
1
Maniac
Эксперт С++
1457 / 958 / 159
Регистрация: 02.01.2009
Сообщений: 2,817
Записей в блоге: 1
16.07.2009, 14:26 9
а про макрос _T(..) забыли?
C++
1
::MessageBox(NULL,_T("Box"),_T("Hello"),0);
1
589 / 356 / 15
Регистрация: 06.02.2009
Сообщений: 1,386
16.07.2009, 14:28 10
ISergey, а какой смысл его использовать если он заменяется на __T(x), а потом это заменяется на L ## x
1
Maniac
Эксперт С++
1457 / 958 / 159
Регистрация: 02.01.2009
Сообщений: 2,817
Записей в блоге: 1
16.07.2009, 14:36 11
Если Юникод включен то заменит на L ## x, если нет то посто х
1
42 / 42 / 4
Регистрация: 14.09.2008
Сообщений: 683
17.07.2009, 15:26 12
Ну это дело вкуса. Когда я сижу через 6 все нормально, а вот когда сажусь за 2005 начинается веселье)) Я еще не привык к ихним модификациям и вечно натыкаюсь на преобразование типов или еще что.

Не знаю у меня всегда ругается на тип char <=> LPCSTR или какой-либо из этого семейства.
0
Любитель давать советы
342 / 135 / 14
Регистрация: 12.01.2009
Сообщений: 511
17.07.2009, 16:19 13
Цитата Сообщение от TGrey[WoLf] Посмотреть сообщение
Ну как видишь

У тебя получился тип char[7], а функция принимает параметр типа LPCTSTR(Long PointerCSTR). Соответственно типы разные и оно само их не приводит.
Для этого на будущее приводи типы в ручную при помощи
C++
1
(type)
Тоесть MessageBox((LPCSTR)"Hello");
или
double a=1.777;
int b = (int)a;
В общем идея ясна. Ну а для удобства сделали такие спецификатор как тебе сказали "L - Long).
Уважаемый, только не надо все запутывать дополнительно, оно и так все запутано
Дело не в буквочке L, за которую Вы уцепились, а в буквочке T, которую Вы настолько не заметили, что благополучно потеряли.

Так, как написали Вы, не прокатит, ибо:
LPCSTR - это и есть const char * - всегда
А вот LPCTSTR - это может быть const char *, а может быть и const wchar_t * - в зависимости от настроек проекта.

Точно так же, в зависимости от тех же настроек, MessageBox преобразуется к MessageBoxA для обычных строк либо к MessageBoxW для строк "юникодовых" (о названиях - тут тема для отдельного разговора).

И уж совершенно разные вещи строки "Привет" и L"Привет", и никакими преобразованиями типа одно в другое не переведешь, разве что специальными функциями типа mbstowcs. Зато можно использовать макрос _T, который генерит тип строки, соответствующий все тем же настройкам проекта.

Поэтому правильным будет один из трех вариантов:
C++
1
2
3
MessageBox(NULL, _T("Привет"), _T("Привет"), MB_OK);
MessageBoxA(NULL, "Привет", "Привет", MB_OK);
MessageBoxW(NULL, L"Привет", L"Привет", MB_OK);
То есть либо явно указываем тип строк и для функции, и для строки, либо полагаемся на настройки проекта снова и там, и там. Все остальные комбинации и ухищрения ведут к ошибкам при изменении настроек проекта.
0
42 / 42 / 4
Регистрация: 14.09.2008
Сообщений: 683
17.07.2009, 18:50 14
Провтыкал T
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.07.2009, 18:50

GetModuleHandle: невозможно преобразовать параметр 1 из 'const char [8]' в 'LPCWSTR'
всем привет)нарыл такую функцию для своей программы,но при компиляции компилятор ругается на...

Error c2440: невозможно преобразовать 'const char [2]' в 'char'
С недавних пор я решил почитать и поучиться программировать, так сказать занять себя чем нибудь...

error C2440: =: невозможно преобразовать 'const char *' в 'char *'
есть вот такой кусок кода int getLex(){ int i = iCurrPos; char strLex, * cp; int j; while...

Cannot convert parameter 1 from 'const char [48]' to 'LPCTSTR'
Кто может помочь в решении следующего вопроса. Недавно начал изучать программирование на С++ в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru