Конвертировать строку в кодировке Юникод в wchar_t

У меня небольшая проблема с приложением при попытке использовать WindowsAPI... Я пытаюсь подключиться к дескриптору так, как он работает, но если я изменяю код, он больше не работает...

Код, который работает:

   handle_t porta; // Global var
   COMMTIMEOUTS tempos;  // Global var
   DCB configuracao; // Global var

   wchar_t pcCommPort[]= TEXT("COM1");
   //gate address to be accessed (COM1)

Код, который я пытаюсь сделать:

   handle_t porta; // Global var
   COMMTIMEOUTS tempos;  // Global var
   DCB configuracao; // Global var

   String GATE = "COM" + Label1->Text;
   wchar_t pcCommPort[]= TEXT(GATE);
   //gate address to be accessed (Any gate)

Я также попробовал это:

   handle_t porta; // Global var
   COMMTIMEOUTS tempos;  // Global var
   DCB configuracao; // Global var

   wchar_t pcCommPort[]= TEXT("COM" + Label1->Text);
   //gate address to be accessed (Any gate)

И это:

   handle_t porta; // Global var
   COMMTIMEOUTS tempos;  // Global var
   DCB configuracao; // Global var

   String GATE = "COM" + Label1->Text;
   wchar_t pcCommPort[]= GATE;
   //gate address to be accessed (Any gate)

В любом случае, или это говорит о том, что у меня нет правильного синтаксиса или ошибки: Невозможно преобразовать строку Unicode в wchar_t.

РЕДАКТИРОВАТЬ:

Полный источник (функция):

void abrirporta(){
   wchar_t pcCommPort[]= TEXT("COM1");
   //endereço da porta a ser acessada (COM1)
   //porta foi declarado como HANDLE na seção private da declaração de classe Form
   //HANDLE porta
   porta = CreateFile(pcCommPort,GENERIC_READ+GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
   if(porta == INVALID_HANDLE_VALUE){
        log(7);
        throw Exception("Não foi possível abrir a porta COM.\nPor favor, tente novamente!");
    }

   //Tempo máximo entre o recebimento de 2 bytes (ms)
   tempos.ReadIntervalTimeout = 20;

   //Multiplicador de tempo de recebimento por byte
   tempos.ReadTotalTimeoutMultiplier = 0;
   tempos.ReadTotalTimeoutConstant = 100;
   tempos.WriteTotalTimeoutMultiplier = 0;
   tempos.WriteTotalTimeoutConstant = 100;
   if(!SetCommTimeouts(porta ,&tempos))
   {
      CloseHandle(porta);
      frmPrincipal->spLig->Visible = False;
      frmPrincipal->spStatusInd->Visible = False;
      log(6);
      throw Exception("Erro na configuração de Timeout");
   }

   GetCommState(porta, &configuracao);

   configuracao.BaudRate = 19200;
   configuracao.ByteSize = 8;
   configuracao.Parity = NOPARITY;
   configuracao.StopBits = ONESTOPBIT;

   if(!SetCommState(porta,&configuracao))
   {
        CloseHandle(porta);
        frmPrincipal->spLig->Visible = False;
        frmPrincipal->spStatusInd->Visible = False;
        log(5);
        throw Exception("Erro na Configuração da porta");
   }
    frmPrincipal->spLig->Visible = True;
    frmPrincipal->spStatusInd->Visible = False;
    log(3);
    frmPrincipal->btEnviar->Enabled = true;
    frmPrincipal->swSaida1->Enabled = true;
    log(8);
}

Я надеюсь, что вы можете помочь мне... С тех пор спасибо XD.

1 ответ

Решение

Вы делаете это сложнее, чем нужно. System::String это псевдоним для System::UnicodeString, который держит wchar_t данные на винде. Вам не нужно копировать UnicodeString данные в wchar_t[] буфер. Вы можете использовать UnicodeString::c_str() метод, когда вам нужно пройти String к функции, которая ожидает wchar_t* параметры, например:

void abrirporta()
{
    String pcCommPort = L"COM" + Label1->Text;
    porta = CreateFile(pcCommPort.c_str(), ...);
    ...
}
Другие вопросы по тегам