尝试使用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。
答案 0 :(得分:4)
你需要做的比较困难。 System::String
是System::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(), ...);
...
}