c ++ sqlite3_prepare_v2无效

时间:2015-07-02 03:45:43

标签: c++ dll sqlite

这是我的第一篇文章,如果我忘记添加一些信息或我的英文错误,请原谅。

我在c ++中使用代码:block(13.12)制作sqlite3函数的DLL并使用MinGW工具链。 (Windows 7)

我使用的是sqlite3_exec功能,但我希望更改为sqlite3_prepare_v2sqlite_bindsqlite3_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_v2sqlite3_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

0 个答案:

没有答案