首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

怎么显式调用动态库中的指针函数?(LoadLibrary,SQLite3,SDK,NOT MFC)

2012-10-16 
如何显式调用动态库中的指针函数?(LoadLibrary,SQLite3,SDK,NOT MFC)动态库中普通函数调用没有问题,但是指

如何显式调用动态库中的指针函数?(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所在的路径。


C/C++ code
/* * 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;} 

热点排行