Problem
The other day we had a problem that databases with Chinese characters
couldn't be opened with ADO. I am pretty sure this has worked years ago but
that was probably Windows 7 back then.
Example code
#include "tappch.hpp"
#include <cassert>
#include <comutil.h>
#include <filesystem>
#include <iostream>
#include <string>
#include <tchar.h>
#import "msado15.dll" rename("EOF", "EndOfFile")
namespace
{
const _bstr_t g_bstrEmpty;
constexpr wchar_t g_szDbTest[] = _T("WL11-旷场.evxt.mdb");
constexpr wchar_t g_szProvider[] = _T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source='");
std::wstring MakeConnectionStringOleDb(const std::filesystem::path& rpthDatabase)
{
const std::wstring strConnection = g_szProvider
+ rpthDatabase.wstring()
+ _T("';Persist Security Info=False");
return strConnection;
}
}
int main()
{
HRESULT hr = ::CoInitialize(nullptr);
try
{
ADODB::_ConnectionPtr ptrConnection;
hr = ptrConnection.CreateInstance(__uuidof(ADODB::Connection));
const _bstr_t bstrConnection = MakeConnectionStringOleDb(g_szDbTest).c_str();
hr = ptrConnection->Open(bstrConnection, g_bstrEmpty, g_bstrEmpty, ADODB::adConnectUnspecified);
const long n = ptrConnection->State;
hr = ptrConnection->Close();
}
catch (const _com_error& re)
{
std::cout << re.Description() << std::endl;
}
::CoUninitialize();
return 0;
}
I was trying to track down the bug in Visual Studio by spitting through
assembly code of the Windows DLL of ADO and OleDB. Visual Studio tough crashed
suddenly and it took all my carefully created breakpoint locations with it. So
I gave up and assume
a bug.