Msado60_Backcompat вылетает в CCommand :: CreateParameter - PullRequest
5 голосов
/ 01 ноября 2011

Я занимаюсь разработкой приложения ADO (32-разрядной) в 64-разрядной версии SP1 для Windows 7 (все обновления установлены): приложение должно работать в 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));

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

raw_CreateParameter () вызывает msado15.dll в CCommand :: CreateParameter. Там происходит сбой по смещению 0x34f (смещение внутри функции):

Исключение первого шанса в 0x655ed5a6 (msado15.dll) в adosqlbugcheck.exe: 0xC0000005: Место записи нарушения прав доступа 0xcccccccc.
Необработанное исключение в 0x655ed5a6 (msado15.dll) в adosqlbugcheck.exe: 0xC0000005: расположение записи нарушения прав доступа 0xcccccccc.

Msado60_Backcompat.tlb: 73728 байт, 29.4.2011
msado15.dll: 6.1.7601.17514, 1019904 байта, 21.11.2010

Ошибка не возникает, если я использую msado15.dll.

Может кто-нибудь воспроизвести ошибку? Есть ли решение?

1 Ответ

7 голосов
/ 15 ноября 2011

Проблема решена. Я # импортировал msado60_backcompat.tlb из "C: \ Program Files \ Common Files". Если я импортирую версию из «C: \ Program Files (x86) \ Common Files», это работает. Компилятор генерирует tlh-файлы из обоих tlb-файлов с одинаковыми UUID и всем остальным, они отличаются только тем, что содержит

typedef __int64 ADO_LONGPTR; 
typedef ADO_LONGPTR PositionEnum_Param; 

В то время как другой содержит

typedef long ADO_LONGPTR; 
typedef enum PositionEnum PositionEnum_Param; 

Из моего понимания интерфейсов COM этого не должно быть. Но так как MS совершает ошибку, они действительно допустили ошибку, похоже, так оно и есть.

Просто для информации, MS предлагает новое решение: http://blogs.msdn.com/b/psssql/archive/2011/10/03/yes-we-made-a-mistake-and-are-finally-going-to-fix-it.aspx.

...