有人能告诉我哪里出了问题吗?我使用的是C++bulder 10.2(clang编译器(。从IDE菜单中,我选择了"文件"|"新建"|"动态链接库",并选择了编译为无依赖项的C。然后我添加了sqliteFcts.c并创建了sqliteFcts.dll库。一切都很好。
sqliteFcts.c.的内容
#include <sqlite3ext.h>
SQLITE_EXTENSION_INIT1
#ifdef _WIN32
__declspec(dllexport)
#endif
int sqlite3_sqliteFcts_init(
sqlite3 *db,
char **pzErrMsg,
const sqlite3_api_routines *pApi
){
int rc = SQLITE_OK;
SQLITE_EXTENSION_INIT2(pApi);
return rc;
}
// My code is above. Code below was created by the IDE
#pragma argsused
int _libmain(unsigned long reason)
{
return 1;
}
从我自己的应用程序,我尝试使用以下代码的dll
int rc;
sqlite3_db_config(db,SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION,1,&rc);
rc=sqlite3_load_extension(db,"C:/temp/sqliteFcts.dll",0,&buf);
我收到错误消息"找不到指定的过程"。根据我所读到的内容,windows希望_libmain是入口点,但sqlite希望sqlite3_sqliteFcts_init是入口点。我不知道如何解决这个问题,也不知道这是否是问题所在。
我终于让它工作了,但有一个松散的结尾。
这条线上的第一个
rc=sqlite3_load_extension(db,"C:/temp/sqliteFcts.dll",0,&buf);
我为第三个参数(入口点(提供了一个null,认为sqlite会解决这个问题,但sqlite会提供sqlite3_sqlitefcts_init(注意小写f(作为入口点,所以不可避免地找不到函数。该行应读取
rc=sqlite3_load_extension(db,"C:/temp/sqliteFcts.dll","sqlite3_sqliteFcts_init",&buf);
也就是说,它仍然没有起作用。在sqlite论坛上收到建议后,我下载了Dependency Walker,发现函数列为_sqlite3_sqliteFcts_init(注意开头的下划线(,尽管我不知道为什么。不管怎样,我把上面的行改成了
rc=sqlite3_load_extension(db,"C:/temp/sqliteFcts.dll","_sqlite3_sqliteFcts_init",&buf);
它奏效了。这是一个32位的实现。后来我发现,当它被编译为64位应用程序时,不需要开头的下划线。如果有人能揭露这个怪癖,我将不胜感激。