2014-09-17 2 views
1

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

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

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) 

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

EDIT:

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

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.

+0

Почему вы продолжаете хранить его в 'wchar_t []' вместо того чтобы держать его в классе строки что-то вроде? –

+0

Вы, кажется, используете C++/CLI, а не C++. –

+0

Если это правда, тогда вы должны использовать API-интерфейсы .Net, а не API Win32. Преобразование типов C++/CLI для совместимости с Win32 - это кошмар, с которым вы не хотите попасть. –

ответ

4

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

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

Итак, мне больше не понадобится wchar_t? Функция c_str() преобразует данные из строки unicode в wchat_t, правильно? – mauroaraujo

+0

@mauroraujo: UnicodeString aldready содержит массив wchar_t (но будет давать аутсайдерам указатель 'const'). Что говорит remy, вам не нужно копировать его содержимое в записываемый массив wchar_t, потому что CreateFile() не нуждается в записываемом указателе. – Medinoc

+0

@mauroaraujo: Если 'UnicodeString' не пуст,' c_str() '(и' data() ') просто возвращает указатель на свои внутренние данные' wchar_t'. Конверсии нет. Если строка пуста, 'c_str()' возвращает указатель на нулевой ограничитель (и 'data()' возвращает NULL). –

Смежные вопросы