Использование sqlite3_load_extension с windows DLL - PullRequest
0 голосов
/ 07 мая 2020

Кто-нибудь может сказать мне, где я здесь ошибаюсь? Я использую C ++ Bulder 10.2 (компилятор clang). В меню IDE я выбрал File | New | Dynami c 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 будет точкой входа, и я понятия не имею, как решить это, или это даже проблема.

1 Ответ

0 голосов
/ 08 мая 2020
• 1000 однако 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-битное приложение, открывающее подчеркивание не требовалось. Если кто-нибудь сможет пролить свет на эту причуду, я был бы признателен.

...