Msado60_Backcompat在CCommand :: CreateParameter中崩溃

Wer*_*nze 5 ado

我正在开发Windows 7 64位SP1上的ADO应用程序(32位)(安装了所有更新):该应用程序必须在Win XP上运行.根据http://support.microsoft.com/kb/2517589/en-us我正在使用msado60_backcompat.直到最近才有效,但现在它崩溃了.

我的代码(片段):

_CommandPtr cmd(__uuidof(Command));
cmd->ActiveConnection = dbconn;
cmd->CommandText = _T("SELECT [si] FROM [TTable] WHERE [TTable].[ti1]=?");
cmd->Parameters->Append(cmd->CreateParameter(L"@ti1", adTinyInt, adParamInput, 1, 7));
Run Code Online (Sandbox Code Playgroud)

CreateParameter在msado60_backcompat中实现:

inline _ParameterPtr Command15::CreateParameter ( _bstr_t Name, enum DataTypeEnum Type, enum ParameterDirectionEnum Direction, ADO_LONGPTR Size, const _variant_t & Value )
{
  struct _Parameter * _result = 0;
  HRESULT _hr = raw_CreateParameter(Name, Type, Direction, Size, Value, &_result);
  if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this));
  return _ParameterPtr(_result, false);
}
Run Code Online (Sandbox Code Playgroud)

raw_CreateParameter()调用msado15.dll到CCommand :: CreateParameter.偏移量0x34f(函数内部的偏移量)发生崩溃:

adosqlbugcheck.exe中0x655ed5a6(msado15.dll)的第一次机会异常:0xC0000005:访问冲突写入位置0xcccccccc.
adosqlbugcheck.exe中0x655ed5a6(msado15.dll)的未处理异常:0xC0000005:访问冲突写入位置0xcccccccc.

Msado60_Backcompat.tlb:73728字节,29.4.2011
msado15.dll:6.1.7601.17514,10199904 字节,21.11.2010

如果我使用msado15.dll,则不会发生此错误.

有人可以重现错误吗?有解决方案吗?

Wer*_*nze 7

问题解决了.我从#C:\ Program Files\Common Files中导入了msado60_backcompat.tlb#.如果我从"C:\ Program Files(x86)\ Common Files"导入版本,它可以工作.编译器从两个完全相同的UUID和其他所有的tlb文件生成tlh文件,它们的区别仅在于

typedef __int64 ADO_LONGPTR; 
typedef ADO_LONGPTR PositionEnum_Param; 
Run Code Online (Sandbox Code Playgroud)

而另一个包含

typedef long ADO_LONGPTR; 
typedef enum PositionEnum PositionEnum_Param; 
Run Code Online (Sandbox Code Playgroud)

根据我对COM接口的理解,这不应该发生.但是既然MS承诺他们真的犯了一个错误,它似乎就是它的样子.

仅供参考,MS有一个新的解决方案:http://blogs.msdn.com/b/psssql/archive/2011/10/03/yes-we-made-a-mistake-and-are-finally- go-to-fix-it.aspx.