Вход | Регистрация
 

Кириллица во внешней компоненте

Кириллица во внешней компоненте
Я
   ДНН
 
18.12.20 - 19:47
Есть внешняя компонента на с++, которая с помощью библиотеки winsock2 запускает прослушку TCP порта. Есть консольный клиент, который тоже на С++. Если с клиента отправить сообщение на кириллице, то в компоненту приходят кракозябры. Где и что нужно добавить, чтобы кириллица корректно обрабатывалась?
   acht
 
1 - 18.12.20 - 19:49
Это тебе к Гений 1С, он по компонентам C++ специалист.
   ДНН
 
2 - 18.12.20 - 19:50
(1) ему бы с Visual Studio сначала разобраться)
   acht
 
3 - 18.12.20 - 19:51
(0) Надо добавлять поддержку уникода и в компоненту и в консольного клиента. 21 век за окном, как никак.
   ДНН
 
4 - 18.12.20 - 19:54
(3) как ее добавить?
   ДНН
 
5 - 18.12.20 - 19:56
char msg[256];
int size = recv(newConnection, msg, sizeof(msg), NULL);
wchar_t* Data;
Data = (wchar_t*)malloc(MaxSizeOfPacket * sizeof(wchar_t));
mbstowcs(Data, msg, MaxSizeOfPacket);

вот код получения сообщения с сокета. Что нужно добавить чтобы уникод можно было получать?
   mistеr
 
6 - 18.12.20 - 19:56
Для начала попробуй chcp в консоли.
   ДНН
 
7 - 18.12.20 - 19:59
(6) да ты гений! добавил в клиента system("chcp 1251"); и все заработало
   ДедМорроз
 
8 - 18.12.20 - 20:41
Ну,вы передаёте байты,а символы они ж unicode.
Просто нужно правильно все преобразовывать.
   ДНН
 
9 - 18.12.20 - 22:27
Не могу через свойство передать строку. В компоненте пишу:
if (TV_VT(varPropVal) != VTYPE_PSTR)
    return false;
m_Ip = TV_STR(varPropVal);

m_Ip - мое свойство. Сделал его доступным как для чтения, так и для записи. Тип char*.

В 1С пишу:
ОбъектКомпоненты.Ip = "127.0.0.1";

Проверяю в отладчике, равно пустой строке.
Где ошибся?
   Garykom
 
10 - 18.12.20 - 22:30
(9) В последней букве логина на мисте ))
   Garykom
 
11 - 18.12.20 - 22:50
(9) у тебя ВК Native API ?
http://catalog.mista.ru/public/184119/
докрути до "Свойства
Первое, что стоит рассмотреть – это инфраструктура свойств. Платформа запрашивает существование свойства методом FindProp"
   Garykom
 
12 - 18.12.20 - 22:58
(11)+ хотя лучше тут http://catalog.mista.ru/public/484743/
case 2:
                if(TV_VT(var) == VTYPE_PSTR) { 
                    delete[] Prop2;
                    size_t len = std::strlen(var->pstrVal);
                    Prop2 = new char[len + 1];
                    std::strncpy(Prop2, var->pstrVal, len + 1);
                    break;
                } else if(TV_VT(var) == VTYPE_PWSTR) {
                    delete[] Prop2;
                    WCHAR_to_char(Prop2, var->pwstrVal);
                    break;
                } else
                    return false;
            case 3:
   Garykom
 
13 - 18.12.20 - 22:59
(12)+ т.е. проверь и на VTYPE_PSTR и на VTYPE_PWSTR
там таких засад дохрена
   ДНН
 
14 - 19.12.20 - 10:56
Внешняя компонента в бесконечном цикле ожидает новых сообщений от подключенного сокета. Чтобы прервать цикл хочу отправлять команду ClosePort. В компоненте сделал так:

while (true) {
    int size = recv(newConnection, msg, sizeof(msg), NULL);
    if (size == -1) {
        closesocket(newConnection);
        break;
    }

    if (msg == "ClosePort") {
        break;
    }
    wchar_t* Source, * Event, * Data;
    Source = (wchar_t*)malloc(MaxSizeOfPacket * sizeof(wchar_t));
    Event = (wchar_t*)malloc(MaxSizeOfPacket * sizeof(wchar_t));
    Data = (wchar_t*)malloc(MaxSizeOfPacket * sizeof(wchar_t));

    mbstowcs(Data, msg, MaxSizeOfPacket);

    wchar_t* ClosePort = L"ClosePort";

    if (Data == ClosePort) {
        break;
    }

    Connect->ExternalEvent(L"Test", L"Test", Data);
}

Однако в условие не попадаю, цикл не прерывается.
Отправляю так:

char msg1[256];
std::cin.getline(msg1, sizeof(msg1));
send(Connection, msg1, sizeof(msg1), NULL);

Что опять не так?
   H A D G E H O G s
 
15 - 19.12.20 - 11:02
Боже, что за дичь
   Кирпич
 
16 - 19.12.20 - 13:10
Автор, пройди курс по c++ для чайников, а то ты как Гений1с, ей богу. Пишу чо хочу, а работать оно обязано.
   ДНН
 
17 - 19.12.20 - 19:30
Последний вопрос. Компонента собрана и под 32х и под 64х, но пока собирал перестали работать свойства и методы на русском. На английском работают. В отладчике выглядит примерно так: ОбъектКомпоненты.Статус
Где что сбилось?
   acht
 
18 - 19.12.20 - 19:33
Кодировка в файлах
   ДНН
 
19 - 19.12.20 - 19:57
(18) Где ее поменять В VS 2019? В интернете пишут Файл - расширенные настройки сохранения файлов, но в 2019 версии нет такого
   acht
 
20 - 19.12.20 - 20:11
(19) В диалоге "File" / "Save ... as" на кнопке "Save" выбрать из выпадающего списка вариант "Save with Encoding"
   ДНН
 
21 - 19.12.20 - 20:15
(20) Точно. Спасибо. Но я уже сделал как тут написано https://docs.microsoft.com/ru-ru/cpp/build/reference/utf-8-set-source-and-executable-character-sets-to-utf-8?view=msvc-160
   Garykom
 
22 - 19.12.20 - 21:37
кажется знаю кто студент который для гения взялся писать ))


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.