如何显式调用动态库中的指针函数?(LoadLibrary,SQLite3,SDK,NOT MFC)
动态库中普通函数调用没有问题,但是指针函数一直查不到相关资料,求解:
如可显式调用SQLite3.dll中的指针函数sqlite3_mprintf()?
该函数在头文件的定义为:SQLITE_API char *sqlite3_mprintf(const char*,...);
[解决办法]
我的代码没有遇到楼主的问题。
在运行代码之前,使用sqlite3.exe创建了数据库
sqlite3.exe test.db
在sqlite3的终端中创建表
create table book(id integer, name varchar(2));
编译时需要添加上sqlite3.h的路径,或拷贝到本地文件夹下。
运行时程序之前,需要在系统path加入sqlite3.dll所在的路径。
/* * main.c * * Created on: 2012-9-27 */#include <sqlite3.h>#include <stdio.h>#include <windows.h>typedef int (*sqlite3_open_t)( const char *filename, /* Database filename (UTF-8) */ sqlite3 **ppDb /* OUT: SQLite db handle */);typedef int (*sqlite3_close_t)(sqlite3*);typedef void (*sqlite3_free_t)(void*);typedef int (*callback_t)(void*,int,char**,char**);typedef int (*sqlite3_exec_t)( sqlite3*, /* An open database */ const char *sql, /* SQL to be evaluated */ callback_t, /* Callback function */ void *, /* 1st argument to callback */ char **errmsg /* Error msg written here */);typedef char * (*sqlite3_mprintf_t)(const char*,...);int main(){ sqlite3 *db; char filename[] = "D:/thsoft/sqlite/test.db"; char *msg; HINSTANCE hInstLibrary = LoadLibrary("sqlite3.dll"); if(hInstLibrary == NULL){ printf("Load library error!\n"); return -1; } // 获取函数地址 sqlite3_open_t sq_open = (sqlite3_open_t)GetProcAddress(hInstLibrary, "sqlite3_open"); sqlite3_exec_t sq_exec = (sqlite3_exec_t)GetProcAddress(hInstLibrary, "sqlite3_exec"); sqlite3_mprintf_t sq_mprintf = (sqlite3_mprintf_t)GetProcAddress(hInstLibrary, "sqlite3_mprintf"); sqlite3_free_t sq_free = (sqlite3_free_t)GetProcAddress(hInstLibrary, "sqlite3_free"); sqlite3_close_t sq_close = (sqlite3_close_t)GetProcAddress(hInstLibrary, "sqlite3_close"); if( !sq_open || !sq_exec || !sq_mprintf || !sq_free || !sq_close ){ printf("Get process address error!\n"); free(hInstLibrary); return -1; } // 打开test数据库 int r = sq_open(filename, &db); if(r != SQLITE_OK){ printf("can not open database!\n"); free(hInstLibrary); return -1; } char *qf = "insert into book values(%d,%Q)"; int i = 0; char *sql; for(; i < 2; ++i){ sql = sq_mprintf(qf, i, "C++"); // 插入记录 r = sq_exec(db, sql, NULL, NULL, &msg); if(r != SQLITE_OK){ printf("%s\n", msg); sq_free(msg); sq_free(sql); break; } sq_free(sql); } // 关闭数据库和释放dll资源 sq_close(db); FreeLibrary(hInstLibrary); return 0;}