Имя: Пароль:
1C
 
Кириллица во внешней компоненте
,
0 ДНН
 
18.12.20
19:47
Есть внешняя компонента на с++, которая с помощью библиотеки winsock2 запускает прослушку TCP порта. Есть консольный клиент, который тоже на С++. Если с клиента отправить сообщение на кириллице, то в компоненту приходят кракозябры. Где и что нужно добавить, чтобы кириллица корректно обрабатывалась?
1 acht
 
18.12.20
19:49
Это тебе к Гений 1С, он по компонентам C++ специалист.
2 ДНН
 
18.12.20
19:50
(1) ему бы с Visual Studio сначала разобраться)
3 acht
 
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);

вот код получения сообщения с сокета. Что нужно добавить чтобы уникод можно было получать?
6 mistеr
 
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";

Проверяю в отладчике, равно пустой строке.
Где ошибся?
10 Garykom
 
гуру
18.12.20
22:30
(9) В последней букве логина на мисте ))
11 Garykom
 
гуру
18.12.20
22:50
(9) у тебя ВК Native API ?
http://catalog.mista.ru/public/184119/
докрути до "Свойства
Первое, что стоит рассмотреть – это инфраструктура свойств. Платформа запрашивает существование свойства методом FindProp"
12 Garykom
 
гуру
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:
13 Garykom
 
гуру
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);

Что опять не так?
15 H A D G E H O G s
 
19.12.20
11:02
Боже, что за дичь
16 Кирпич
 
19.12.20
13:10
Автор, пройди курс по c++ для чайников, а то ты как Гений1с, ей богу. Пишу чо хочу, а работать оно обязано.
17 ДНН
 
19.12.20
19:30
Последний вопрос. Компонента собрана и под 32х и под 64х, но пока собирал перестали работать свойства и методы на русском. На английском работают. В отладчике выглядит примерно так: ОбъектКомпоненты.Статус
Где что сбилось?
18 acht
 
19.12.20
19:33
Кодировка в файлах
19 ДНН
 
19.12.20
19:57
(18) Где ее поменять В VS 2019? В интернете пишут Файл - расширенные настройки сохранения файлов, но в 2019 версии нет такого
20 acht
 
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
22 Garykom
 
гуру
19.12.20
21:37
кажется знаю кто студент который для гения взялся писать ))
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший