64位迁移问题:指针变化
问题描述:
我使用的是A Lightweight C++ Wrapper for Microsoft's ODBC API的Ernesto Guisado,虽然无法从DDJ下载源文件,但我在github上找到了一份副本。64位迁移问题:指针变化
我可以在Win32当前代码编译,但在64位编译命中错误
error C2664: 'SQLRETURN SQLDescribeCol(SQLHSTMT,SQLUSMALLINT,SQLCHAR *,SQLSMALLINT,SQLSMALLINT *,SQLSMALLINT *,SQLULEN *,SQLSMALLINT *,SQLSMALLINT *)' :
cannot convert argument 7 from 'ULONG *' to 'SQLULEN *'
,基本上不能分配ULONG *
(ULONG
是32位),以SQLULEN *
(SQLULEN
是64-位)。
我该怎么做才能顺利升级ULONG,这样才能有64位版本?
答
代码期望一个类型等同于另一个可能不同的类型,这是一个不好的做法。
为了使类接口完好无损,你应该改变的功能是这样的:
void SqlStatement::DescribeCol(USHORT number, UCHAR *name,
USHORT BufferLength, SHORT *NameLength,
SHORT *DataType, ULONG *ColumnSize,
SHORT *DecimalDigits, SHORT *Nullable)
{
SQLULEN tmpColumnSize; // store column size before converting to ULONG
assert(IsValid());
CheckStatus(::SQLDescribeCol(m_hstmt, number, name,
BufferLength, NameLength,
DataType, &tmpColumnSize,
DecimalDigits, Nullable));
if(ColumnSize) *ColumnSize = (ULONG)tmpColumnSize;
}
如果该类接口没关系,你也可以在功能上取代ULONG通过SQLULEN。
都是指针。 –
@ TheTechel是的,但是一个指向一个32位的ULONG,另一个指向一个64位的UINT64。 – athos
您应该将ULONG更改为SQLULEN –