将sqlite3_load_extension与Windows DLL一起使用

问题描述 投票:0回答:1

谁能告诉我我要去哪里错了?我正在使用C ++ bulder 10.2(clang编译器)。从IDE菜单中,我选择了File | New | Dynamic Link Library,并选择了无依赖地编译为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是入口点,我不知道如何解决这个问题,或者甚至是问题所在。

c++ c windows sqlite builder
1个回答
0
投票

我终于使它工作了,但结局很差。

首先在此行

rc=sqlite3_load_extension(db,"C:/temp/sqliteFcts.dll",0,&buf);

我为第三个参数(入口点)提供了一个空值,认为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位应用程序时,不需要下划线。如果有人可以对此提出任何建议,我将不胜感激。

© www.soinside.com 2019 - 2024. All rights reserved.