64位迁移问题:指针更改

时间:2017-05-09 10:37:44

标签: c++ migration 64-bit

我使用A Lightweight C++ Wrapper for Microsoft's ODBC API Ernesto Guisado,但无法从DDJ下载源文件,我设法在github上找到了副本。

我可以使用win32中的当前代码进行编译,但是在x64中进行编译会遇到错误

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位版本?

1 个答案:

答案 0 :(得分:1)

代码期望一个类型可能与另一个类型相同,这是一种不好的做法。

为了保持类接口的完整性,您应该将函数更改为:

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;
}

如果类接口无关紧要,您也可以在函数中用SQLULEN替换ULONG。