In C++, I use OLEDB, like : Establishing a Connection to a Data Source
For SQLCE, I replace "CoCreateInstance(CLSID_SQLNCLI..."
by :
// [C++] [Language]
// Conformance mode : No (/Permissive)
#include "sqlce_err.h"
#include "sqlce_oledb.h"
#include "sqlce_sync.h"
IDBInitialize* pDBInitialize = NULL;
IClassFactory* pClassFactory = NULL;
HRESULT DllCoCreateInstance(HMODULE hModule, REFCLSID rclsid, LPUNKNOWN pUnkOuter, REFIID riid, LPVOID FAR* ppv);
then :
HRESULT hr;
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
HMODULE hModule = NULL;
// sqlceoledb40.dll deployed in the .exe directory (with sqlceer40EN.dll, sqlceer40FR.dll, sqlceqp40.dll, sqlcese40.dll)
hModule = LoadLibrary(L"sqlceoledb40.dll");
hr = DllCoCreateInstance(hModule, CLSID_SQLSERVERCE, NULL, IID_IDBInitialize, (void**)&pDBInitialize);
with the utility function :
HRESULT DllCoCreateInstance(HMODULE hModule, REFCLSID rclsid, LPUNKNOWN pUnkOuter, REFIID riid, LPVOID FAR* ppv)
{
HRESULT hr = S_OK;
if (hModule == NULL)
return E_INVALIDARG;
BOOL(WINAPI * DllGetClassObject)(REFCLSID, REFIID, LPVOID) = NULL;
(FARPROC&)DllGetClassObject = GetProcAddress(hModule, "DllGetClassObject");
if (DllGetClassObject == NULL)
return HRESULT_FROM_WIN32(GetLastError());
hr = DllGetClassObject(rclsid, IID_IClassFactory, &pClassFactory);
if (FAILED(hr))
{
return hr;
}
return pClassFactory->CreateInstance(pUnkOuter, riid, ppv);
}