1+ #include < windows.h>
2+ #include " SQLiteDLLConnect.h"
3+ #include < cassert>
4+ #include < string>
5+ #include < system_error>
6+
7+
8+ namespace SQLite_DLL
9+ {
10+ template <typename TProc>
11+ inline bool GetProcAddressChecked (HINSTANCE hINSTANCE, const std::string& procName, TProc& typeFunc)
12+ {
13+ if (hINSTANCE == NULL )
14+ return false ;
15+ PROC ret = GetProcAddress (hINSTANCE, procName.c_str ());
16+ if (!ret)
17+ throw std::system_error (GetLastError (), std::system_category (), " GetProcAddress failed" );
18+ typeFunc = reinterpret_cast <TProc>(ret);
19+ return true ;
20+ }
21+ static HINSTANCE HinstanceSqliteDll = NULL ;
22+
23+ typedef int (WINAPI* SQLITE3_CONFIG)(int , ...);
24+ static SQLITE3_CONFIG SQLite3_config;
25+
26+ typedef char * (WINAPI* SQLITE3_MPRINTF)(const char *, ...);
27+ static SQLITE3_MPRINTF SQLite3_mprintf;
28+
29+ typedef char * (WINAPI* SQLITE3_SNPRINTF)(int , char *, const char *, ...);
30+ static SQLITE3_SNPRINTF SQLite3_snprintf;
31+
32+ typedef int (WINAPI* SQLITE3_DB_CONFIG)(sqlite3*, int op, ...);
33+ static SQLITE3_DB_CONFIG SQLite3_db_config;
34+
35+ typedef void (WINAPI* SQLITE3_LOG)(int iErrCode, const char * zFormat, ...);
36+ static SQLITE3_LOG SQLite3_log;
37+
38+ typedef int (WINAPI* SQLITE3_VTAB_CONFIG)(sqlite3*, int op, ...);
39+ static SQLITE3_VTAB_CONFIG SQLite3_vtab_config;
40+
41+
42+ RunTimeConnect::RunTimeConnect (std::string DllFileName)
43+ {
44+ HinstanceSqliteDll = LoadLibraryA (DllFileName.c_str ());
45+ assert (GetProcAddressChecked (HinstanceSqliteDll, " sqlite3_config" , SQLite3_config));
46+ assert (GetProcAddressChecked (HinstanceSqliteDll, " sqlite3_mprintf" , SQLite3_mprintf));
47+ assert (GetProcAddressChecked (HinstanceSqliteDll, " sqlite3_snprintf" , SQLite3_snprintf));
48+ assert (GetProcAddressChecked (HinstanceSqliteDll, " sqlite3_db_config" , SQLite3_db_config));
49+ assert (GetProcAddressChecked (HinstanceSqliteDll, " sqlite3_log" , SQLite3_log));
50+ assert (GetProcAddressChecked (HinstanceSqliteDll, " sqlite3_vtab_config" , SQLite3_vtab_config));
51+ }
52+
53+ #pragma warning (disable : 4793)
54+ int RunTimeConnect::sqlite3_config (int arg, ...)
55+ {
56+ va_list ap;
57+ va_start (ap, arg);
58+ int r = SQLite3_config (arg, ap);
59+ va_end (ap);
60+ return r;
61+ }
62+
63+ char * RunTimeConnect::sqlite3_mprintf (const char * arg, ...)
64+ {
65+ va_list ap;
66+ va_start (ap, arg);
67+ char * r = SQLite3_mprintf (arg, ap);
68+ va_end (ap);
69+ return r;
70+ }
71+
72+ char * RunTimeConnect::sqlite3_snprintf (int i, char * arg, const char * arg2, ...)
73+ {
74+ va_list ap;
75+ va_start (ap, arg2);
76+ char * r = SQLite3_snprintf (i, arg, arg2, ap);
77+ va_end (ap);
78+ return r;
79+ }
80+
81+ int RunTimeConnect::sqlite3_db_config (sqlite3* db, int arg, ...)
82+ {
83+ va_list ap;
84+ va_start (ap, arg);
85+ int r = SQLite3_db_config (db, arg, ap);
86+ va_end (ap);
87+ return r;
88+ }
89+
90+ void RunTimeConnect::sqlite3_log (int iErrCode, const char * arg, ...)
91+ {
92+ va_list ap;
93+ va_start (ap, arg);
94+ SQLite3_log (iErrCode, arg, ap);
95+ va_end (ap);
96+ }
97+
98+ int RunTimeConnect::sqlite3_vtab_config (sqlite3* db, int arg, ...)
99+ {
100+ va_list ap;
101+ va_start (ap, arg);
102+ int r = SQLite3_vtab_config (db, arg, ap);
103+ va_end (ap);
104+ return r;
105+ }
106+
107+ }
0 commit comments