这是我的第一篇文章,如果我忘记添加一些信息或我的英文错误,请原谅。
我在c ++中使用代码:block(13.12)制作sqlite3函数的DLL并使用MinGW工具链。 (Windows 7)
我使用的是sqlite3_exec
功能,但我希望更改为sqlite3_prepare_v2
,sqlite_bind
,sqlite3_step
等,因为我认为很容易找回PARAMS。
但是,在用c ++编写的另一个程序调用该新函数之后,它崩溃了,给了我这个错误:
Nombre del evento de problema: APPCRASH
Nombre de la aplicación: SQL_try.exe
Versión de la aplicación: 0.0.0.0
Marca de tiempo de la aplicación: 5594a5af
Nombre del módulo con errores: sqlite3.dll
Versión del módulo con errores: 3.8.10.2
Marca de tiempo del módulo con errores: 555cd28a
Código de excepción: c0000005
Desplazamiento de excepción: 0001ee21
Versión del sistema operativo: 6.1.7601.2.1.0.768.3
Id. de configuración regional: 3082
Información adicional 1: 0a9e
Información adicional 2: 0a9e372d3b4ad19135b953a78882e789`
Información adicional 3: 0a9e
Información adicional 4: 0a9e372d3b4ad19135b953a78882e789
我无法轻易地将其解压缩,因为我不使用代码:阻止我也从DLL调用函数。
这是我正在使用的功能,我从其他帖子中得到它:[Proper use of callback function of sqlite3 in C++
string DLL_EXPORT readFromDB(sqlite3* db, int id)
{ string result;
sqlite3_stmt *stmt;
const char *sql="SELECT name FROM datos WHERE id = ?";
int rc = sqlite3_prepare_v2(db, sql,-1 , &stmt, NULL);
if (rc != SQLITE_OK)
return string(sqlite3_errmsg(db));
rc = sqlite3_bind_int(stmt, 1, id); // Using parameters ("?") is not
if (rc != SQLITE_OK) { // really necessary, but recommended
string errmsg(sqlite3_errmsg(db)); // (especially for strings) to avoid
sqlite3_finalize(stmt); // formatting problems and SQL
return errmsg; // injection attacks.
}
rc = sqlite3_step(stmt);
if (rc != SQLITE_ROW && rc != SQLITE_DONE) {
string errmsg(sqlite3_errmsg(db));
sqlite3_finalize(stmt);
return errmsg;
}
if (rc == SQLITE_DONE) {
sqlite3_finalize(stmt);
return string("customer not found");
}
result= string((char *)sqlite3_column_text(stmt, 0))+ " ";
// *result=*result + string((char*)sqlite3_column_text(stmt, 1)) +" ";
//*result=*result + string((char*)sqlite3_column_int(stmt, 2));
sqlite3_finalize(stmt);
return result;
}
我用:
调用DLL函数typedef string (*Myfunc5) (sqlite3*,int);
Myfunc5 mifunc5(0);
string String;
mifunc5=(Myfunc5)GetProcAddress( histDLL,"readFromDB");
String=(mifunc5)(db,1);
我不认为问题是没有加载db,因为其他函数有效,我试图评论除sqlite3_prepare_v2
和sqlite3_finalize
函数之外的所有函数,但都不起作用。< / p>
编辑:
DLLSQL.h:
#include "sqlite3.h"
#include <stdio.h>
#include <string>
#include <stdexcept> // std::invalid_argument
/* To use this exported function of dll, include this header
* in your project.
*/
#define DLL_EXPORT __declspec(dllexport)
using std::string;
using std::exception;
#ifdef __cplusplus
extern "C"
{
#endif
//void DLL_EXPORT SomeFunction(const LPCSTR sometext);
int DLL_EXPORT CreateDatabase(sqlite3** db,string dbname);
int DLL_EXPORT ejemplo(char db_err);
int DLL_EXPORT CreateTable(sqlite3* db, string tbname,char * db_err);
int DLL_EXPORT fill(sqlite3* db, string tbname);
void DLL_EXPORT display(sqlite3* db, string tbname);
void DLL_EXPORT jokersql(sqlite3* db, string sql);
int DLL_EXPORT row(sqlite3* db, string tbname,string col,string id,int (*callback)(void*,int,char**,char**),void *answer, char **argv);
int DLL_EXPORT n_row(sqlite3* db, string tbname,int (*callback)(void*,int,char**,char**),void *answer);
string DLL_EXPORT readFromDB(sqlite3* db, int id);
#ifdef __cplusplus
}
#endif