Я безуспешно пытаюсь решить проблему, связанную с несколькими (двумя или более) соединениями ODB C с драйвером Microsoft Access на Windows x64 (оба Windows 10 и 7). В частности, когда закрывается последнее соединение (второе в примере), происходит нарушение прав доступа (в модуле Mso30win32client.dll). Эта проблема не появляется, если код построен для цели x86 (win32). Я пробовал разные компиляторы (C ++ Builder 10.2, Visual C 2019, MingW64 4.5.3) без успеха. Я использую драйвер MS Access ODB C, установленный вместе с Office 2016 (установлены все обновления), чья версия 16.00.4951.1000 (ACEODB C .DLL). Если я изменяю источник данных с помощью нескольких подключений с драйвером MySQL, код отлично работает как для 32-, так и для 64-разрядных целей.
Вот код:
#include <windows.h>
#include <stdio.h>
#include <sql.h>
#include <sqlext.h>
#ifdef _WIN64
const TCHAR * DsnSource1 = TEXT("Driver={Microsoft Access Driver (*.mdb, *.accdb)};"
"Dbq=..\\..\\Ligands.mdb");
const TCHAR * DsnSource2 = TEXT("Driver={Microsoft Access Driver (*.mdb, *.accdb)};"
"Dbq=..\\..\\Pockets.mdb");
#else
const TCHAR * DsnSource1 = TEXT("Driver={Microsoft Access Driver (*.mdb)};"
"Dbq=..\\..\\Ligands.mdb");
const TCHAR * DsnSource2 = TEXT("Driver={Microsoft Access Driver (*.mdb)};"
"Dbq=..\\..\\Pockets.mdb");
#endif
int main(int argc, char *argv[])
{
SQLRETURN Res;
HDBC hDBC1, hDBC2;
HENV hEnv;
Res = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv);
Res = SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0);
Res = SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDBC1);
Res = SQLDriverConnect(hDBC1, NULL, (SQLTCHAR *)DsnSource1, SQL_NTS,
NULL, 0, NULL, SQL_DRIVER_NOPROMPT);
Res = SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDBC2);
Res = SQLDriverConnect(hDBC2, NULL, (SQLTCHAR *)DsnSource2, SQL_NTS,
NULL, 0, NULL, SQL_DRIVER_NOPROMPT);
Res = SQLDisconnect(hDBC1);
Res = SQLFreeHandle(SQL_HANDLE_DBC, hDBC1);
Res = SQLDisconnect(hDBC2); /* <- Access violation */
Res = SQLFreeHandle(SQL_HANDLE_DBC, hDBC2);
Res = SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
return 0;
}
Не знаю понять были проблемы. Любое предложение приветствуется и спасибо заранее.