我遇到了同样的问题,在该问题中,我从函数中获得了LPTSTR端口名参数作为输入。我必须将其转换为wstring,以便获取端口参数。
下面是试图将lptstr复制到wstring的代码段。
void C_PORT_MONITOR::SetPrinterComPortParam(LPTSTR PortName)
{
#ifdef _UNICODE
std::wstring l_ComPortName;
#else
std::string l_ComPortName;
#endif
DWORD dwSize,le = 0;
dwSize = sizeof(COMMCONFIG);
LPCOMMCONFIG lpCC = (LPCOMMCONFIG) new BYTE[dwSize];
l_ComPortName = PortName;//mPortName;
if(l_ComPortName.length() <= 0 )
return;
bool SetFlag = false;
//Get COMM port params called to get size of config. block
int length = l_ComPortName.length();
int iPos = l_ComPortName.find_first_of(':');
int iChc = length- iPos; //remove the charactrers after :
l_ComPortName = l_ComPortName.substr(0, (length- iChc)); //remove the characters from colon //COM1
//Get COMM port params with defined size
BOOL ret = GetDefaultCommConfig(l_ComPortName.c_str(), lpCC, &dwSize);
_RPT1(_CRT_WARN, "C_PORT_MONITOR::SetPrinterComPortParam length=%x,iPos=%x,iChc=%x,l_ComPortName=%s",length, iPos, iChc, l_ComPortName);
if(!ret)
{
le = GetLastError();
_RPT1(_CRT_WARN ,"C_PORT_MONITOR::SetPrinterComPortParam LastError=%x",le);
}
我需要将此端口名分配给l_comportname。我需要从此l_comportname作为COM1创建一个子字符串,并且必须在getdafaultcommconfig()中使用该子字符串
答案 0 :(得分:1)
您的错误是第二个参数,而不是第一个。您的调试语句有问题,因为它不能解释宽字符串%s
仅用于窄字符串,您应该对宽字符串使用%S
。
这是真正的错误
dwSize = sizeof(COMMCONFIG);
LPCOMMCONFIG lpCC = (LPCOMMCONFIG) new BYTE[dwSize];
lpCC->dwSize = sizeof(COMMCONFIG); // this line is needed
您可能也需要它(文档不是很清楚)
lpCC->wVersion = 1;
在Windows编程中,很常见,您必须使用结构的大小来初始化结构。