无法将‘WCHAR [256]’转换为‘WCHAR’的函数返回错误解决
SCardInstanceId函数返回类型错误问题分析与解决
问题重现
你编写的函数代码:
WCHAR SCardInstanceId(SCARDCONTEXT phContext, LPTSTR szReaderName) { WCHAR szDeviceInstanceId[256]; DWORD cchDeviceInstanceId = 256; long lReturn = SCardGetReaderDeviceInstanceId(phContext, szReaderName, szDeviceInstanceId, &cchDeviceInstanceId); if (lReturn != SCARD_S_SUCCESS) { cout << "Failed SCardGetReaderDeviceInstanceId, errorcode: " << std::hex << std::setfill('0') << std::setw(8) << lReturn << endl; exit(1); } return szDeviceInstanceId; }
编译时出现错误:
E0120 return value type does not match the function type Error C2440 'return': cannot convert from 'WCHAR [256]' to 'WCHAR'
问题原因
函数声明的返回类型是WCHAR(单个宽字符),但你实际返回的是WCHAR[256](长度为256的宽字符数组),两者类型完全不匹配,编译器无法完成隐式转换,因此报错。
解决方法
由于你无法将返回类型修改为WCHAR[256],可以采用以下两种可行方案:
方案1:让调用者提供输出缓冲区
修改函数参数,由调用者预先分配好缓冲区并传入,函数直接将结果写入缓冲区,返回错误码表示执行结果:
long SCardInstanceId(SCARDCONTEXT phContext, LPTSTR szReaderName, WCHAR* szDeviceInstanceId, DWORD* cchDeviceInstanceId) { long lReturn = SCardGetReaderDeviceInstanceId(phContext, szReaderName, szDeviceInstanceId, cchDeviceInstanceId); if (lReturn != SCARD_S_SUCCESS) { cout << "Failed SCardGetReaderDeviceInstanceId, errorcode: " << std::hex << std::setfill('0') << std::setw(8) << lReturn << endl; } return lReturn; }
调用示例:
WCHAR deviceInstanceId[256]; DWORD bufferLen = 256; long result = SCardInstanceId(hContext, L"MyReader", deviceInstanceId, &bufferLen); if (result == SCARD_S_SUCCESS) { // 使用deviceInstanceId中的数据 }
方案2:返回动态分配的缓冲区指针
将函数返回类型改为WCHAR*,在函数内部动态分配内存存储结果,调用者使用完后需手动释放内存避免泄漏:
WCHAR* SCardInstanceId(SCARDCONTEXT phContext, LPTSTR szReaderName) { WCHAR* szDeviceInstanceId = new WCHAR[256]; DWORD cchDeviceInstanceId = 256; long lReturn = SCardGetReaderDeviceInstanceId(phContext, szReaderName, szDeviceInstanceId, &cchDeviceInstanceId); if (lReturn != SCARD_S_SUCCESS) { cout << "Failed SCardGetReaderDeviceInstanceId, errorcode: " << std::hex << std::setfill('0') << std::setw(8) << lReturn << endl; delete[] szDeviceInstanceId; return nullptr; } return szDeviceInstanceId; }
调用示例:
WCHAR* deviceId = SCardInstanceId(hContext, L"MyReader"); if (deviceId != nullptr) { // 使用deviceId delete[] deviceId; // 用完必须释放内存 }
关于返回WCHAR[256]的合法性
C不允许直接将数组类型作为函数返回值。数组在函数返回时会自动退化为指针,且语法上不支持直接返回数组类型。如果想要返回固定长度的数组容器,可以使用std::array<WCHAR, 256>(C11及以上标准支持),这是合法的返回类型,它是一个封装了固定大小数组的类模板,可以直接返回。
内容的提问来源于stack exchange,提问作者user14321683
相关产品推荐
相关产品推荐

