Форум программистов, компьютерный форум CyberForum.ru

Char, TCHAR, wchar_t - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
saserlend
10 / 10 / 1
Регистрация: 25.11.2011
Сообщений: 138
06.04.2014, 15:40     Char, TCHAR, wchar_t #1
Как правильно записать эти 2 участка кода .
Ошибки -
Кликните здесь для просмотра всего текста
1>d:\c++\lab1\lab1\main.cpp(54): error C2664: strcpy: невозможно преобразовать параметр 2 из "TCHAR *" в "const char *"
1> Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции
1>d:\c++\lab1\lab1\main.cpp(56): error C2664: strcat: невозможно преобразовать параметр 2 из "TCHAR *" в "const char *"
1> Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции
1>d:\c++\lab1\lab1\main.cpp(67): error C2664: CreateProcessW: невозможно преобразовать параметр 2 из "char [20]" в "LPWSTR"

C++
1
2
3
4
char command[20];
    strcpy(command, argv[1]);
    strcat(command, " ");
    strcat(command, argv[2]);
C++
1
int _tmain( int argc, TCHAR *argv[] )
Кликните здесь для просмотра всего текста
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
#include <windows.h>
#include <tchar.h>
#include <time.h>       /* time_t, struct tm, time, localtime, strftime */
#include <conio.h>
#include <fstream>
#include <iostream>
 
using namespace std;
 
#define VALUE_COUNT 20
 
int _tmain( int argc, TCHAR *argv[] )
{
    //------ pipe --------------------------------
    HANDLE hReadPipe, hWritePipe;
    SECURITY_ATTRIBUTES PipeSA = {sizeof(SECURITY_ATTRIBUTES), NULL, TRUE};
    CreatePipe(&hReadPipe, &hWritePipe, &PipeSA, 0);
    //--------------------------------------------
    
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
 
    ZeroMemory( &si, sizeof(si) );
    si.cb = sizeof(si);
    ZeroMemory( &pi, sizeof(pi) );
 
    si.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
    si.hStdError = GetStdHandle(STD_ERROR_HANDLE);
    si.hStdOutput = hWritePipe;
    si.dwFlags = STARTF_USESTDHANDLES;
 
    if( argc != 3 )
    {
        printf("Usage: lab1.exe [file_name] . Example: lab1.exe out.txt\n");
        return 1;
    }
 
    //------------------------------------------------
    ofstream file; 
    file.open(argv[2], ios_base::out); //открываем файл
    
    int temp;
    cout << "File content: " << endl;
    for (int i = 0; i < VALUE_COUNT; ++i) { //заполняем случайными значениями
        temp = rand() % 255; //случайные значения в диапозоне от 0 до 255
        file << temp << " ";
        cout << temp << " ";
    }
    cout <<  endl;
    file.close(); //закрываем файл
    //<<----------------------------------------------
 
    char command[20];
    strcpy(command, argv[1]);
    strcat(command, " ");
    strcat(command, argv[2]);
    // Start the child process. 
    if( !CreateProcess( NULL,   // No module name (use command line)
        command,        // Command line
        NULL,           // Process handle not inheritable
        NULL,           // Thread handle not inheritable
        TRUE,          // Set handle inheritance to FALSE
        0,              //flag to create new console
        NULL,           // Use parent's environment block
        NULL,           // Use parent's starting directory 
        &si,            // Pointer to STARTUPINFO structure
        &pi )           // Pointer to PROCESS_INFORMATION structure
    ) 
    {
        cout << "CreateProcess failed " <<  GetLastError() << endl;
        return 1;
    }
 
    // Wait until child process exits.
    WaitForSingleObject( pi.hProcess, INFINITE );
 
    DWORD dwRead;
    CHAR chBuf[80];
    ReadFile(hReadPipe, chBuf, 80, &dwRead, NULL);
    chBuf[dwRead] = '\0';
    cout << "(GET FROM CHILD PROCESS) max: " << chBuf << endl;
 
    // Close pipe handles
    CloseHandle(hReadPipe);
    CloseHandle(hWritePipe);
    // Close process and thread handles. 
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );
 
    cout << "press any key..." << endl;
    getch();
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.04.2014, 15:40     Char, TCHAR, wchar_t
Посмотрите здесь:

C++ Преобразование wchar_t в char
C++ Cannot convert 'wchar_t &' to 'const char *'
Преобразование типов wchar_t в char и обратно C++
C++ Преобразование char* в const wchar_t *
C++ Cannot convert 'wchar_t *' to 'const char *'
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kventin_zhuk
БНТУ ФИТР
 Аватар для kventin_zhuk
214 / 154 / 15
Регистрация: 26.12.2012
Сообщений: 382
06.04.2014, 15:59     Char, TCHAR, wchar_t #2
saserlend, определитесь что вам нужно, юникод или ANSI. В проекте отключити поддержку юникода - и будет норм компилироваться( Solution explorer -> Select project -> Properties -> Configuration -> General -> Charecter set -> Not set)

Добавлено через 3 минуты
Или же, если требуется юникод - использовать функции работы с юникод-строками(wchar.h)
Вованя
116 / 116 / 46
Регистрация: 20.02.2014
Сообщений: 408
06.04.2014, 16:38     Char, TCHAR, wchar_t #3
TCHAR это виндовский дефайн wchar_t, поэтому для их работы используй функции, начинающиеся на wcs...
Если, например, надо конвертнуть строку char в wchar_t используй функцию wcstombs и наоборот mbstowcs и прочее
В твоем случае
C++ (Qt)
1
2
wchar_t command[20];
wcscpy(command, argv[1]
и так далее
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
06.04.2014, 16:41     Char, TCHAR, wchar_t #4
Цитата Сообщение от Вованя Посмотреть сообщение
TCHAR это виндовский дефайн wchar_t
Вообще-то, нет. Если в настройках проекта стоит "Use Unicode Character set", то TCHAR будет замещено wchar_t, а если стоит "Use Multi-byte character set", то будет замещено на char
Вованя
116 / 116 / 46
Регистрация: 20.02.2014
Сообщений: 408
06.04.2014, 16:46     Char, TCHAR, wchar_t #5
Цитата Сообщение от Dani Посмотреть сообщение
Вообще-то, нет. Если в настройках проекта стоит "Use Unicode Character set", то TCHAR будет замещено wchar_t, а если стоит "Use Multi-byte character set", то будет замещено на char
Справедливо, но очевидно, что в данном случае определено как wchar_t
iRomul
 Аватар для iRomul
158 / 99 / 11
Регистрация: 17.10.2012
Сообщений: 474
Завершенные тесты: 1
06.04.2014, 16:58     Char, TCHAR, wchar_t #6
Dani, а не наоборот? wchar_t больше подходит под описание "Multi-byte character set". А Юникод (UTF8) помещается в 1 байте. Поправьте, если ошибаюсь.
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
06.04.2014, 17:27     Char, TCHAR, wchar_t #7
iRomul, ну char точно меньше подходит под "Use Unicode Character set".
Цитата Сообщение от iRomul Посмотреть сообщение
А Юникод (UTF8) помещается в 1 байте
А это в корне неверно. UTF-8 может юзать как 1,2,3 даже 6 байтов. 1 байт будет только для символов, у которых кодовая точка меньше 128.

Добавлено через 1 минуту
А первые 128 символов в UTF-8 совпадают в символами ASCII
iRomul
 Аватар для iRomul
158 / 99 / 11
Регистрация: 17.10.2012
Сообщений: 474
Завершенные тесты: 1
06.04.2014, 17:29     Char, TCHAR, wchar_t #8
Цитата Сообщение от Dani Посмотреть сообщение
А это в корне неверно. UTF-8 может юзать как 1,2,3 даже 6 байтов. 1 байт будет только для символов, у которых кодовая точка меньше 128.
Но ведь это уже будет не UTF8, а UTF16/32
Цитата Сообщение от Dani Посмотреть сообщение
ну char точно меньше подходит под "Use Unicode Character set".
И как за счёт однобайтового char будет обеспечиваться поддержка мультибайтовых символов?
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
06.04.2014, 17:31     Char, TCHAR, wchar_t #9
Цитата Сообщение от iRomul Посмотреть сообщение
А Юникод (UTF8) помещается в 1 байте
Как тысячи символов влезут в один байт?

Добавлено через 1 минуту
Цитата Сообщение от iRomul Посмотреть сообщение
Но ведь это уже будет не UTF8, а UTF16/32
Прошу просвятиться http://ru.wikipedia.org/wiki/UTF-8
iRomul
 Аватар для iRomul
158 / 99 / 11
Регистрация: 17.10.2012
Сообщений: 474
Завершенные тесты: 1
06.04.2014, 17:33     Char, TCHAR, wchar_t #10
Dani, хорошо, с юникодом вроде ясно, но тогда что такое Multi-byte character set?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.04.2014, 17:35     Char, TCHAR, wchar_t
Еще ссылки по теме:

C++ Wchar_t to char
C++ В чём различие char, wchar_t, char16_t, char32_t?
Как перевести TCHAR в CHAR и обратно C++

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

Или воспользуйтесь поиском по форуму:
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
06.04.2014, 17:35     Char, TCHAR, wchar_t #11
Прошу просвятиться http://msdn.microsoft.com/en-us/library/4bb3e64h.aspx
Yandex
Объявления
06.04.2014, 17:35     Char, TCHAR, wchar_t
Ответ Создать тему
Опции темы

Текущее время: 09:16. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru