将unicode字符串转换为wchar_t

时间:2014-09-17 23:56:27

标签: winapi unicode firemonkey wchar-t c++builder-xe6

尝试使用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 个答案:

答案 0 :(得分:4)

你需要做的比较困难。 System::StringSystem::UnicodeString的别名,它在Windows上保存wchar_t个数据。您无需将UnicodeString数据复制到wchar_t[]缓冲区。当您需要将UnicodeString::c_str()传递给期望String参数的函数时,可以使用wchar_t*方法,例如:

void abrirporta()
{
    String pcCommPort = L"COM" + Label1->Text;
    porta = CreateFile(pcCommPort.c_str(), ...);
    ...
}