• 1099阅读
  • 0回复

[提问]VS2019+QT5.15.2工程中调用VS2010+QT4.8.6生成的DLL报异常怎么解决? [复制链接]

上一主题 下一主题
离线gouxionglily
 

只看楼主 倒序阅读 楼主  发表于: 2021-05-28
如题。
我有一个VS2010+QT4.86环境下编绎生成的DLL,现在需要在VS2019+QT5.15.2环境中使用它。考虑到DLL理论上并不与QT有关,只要32位或者64位对应调用32位或者64位的DLL即可,因此决定试一下。试用的结果是:
1.确实能调起来,VS2019+QT5.15.2工程中能调用VS2010+QT4.8.6生成的DLL,程序能正常启动。
2.传参报异常。就是在VS2019+QT5.15.2工程中调用VS2010+QT4.8.6生成的DLL时,由VS2019+QT5.15.2工程向VS2010+QT4.8.6生成的DLL中传参数后,VS2010+QT4.8.6生成的DLL无法识别传入的参数。不管是值传递还是引用传递,都不对。

示例代码如下:
(一)VS2010+QT4.8.6生成的DLL中的接口函数示例:

bool DbDLL::init(QString dbPath)
{
        QSqlDatabase m_database;
    const char* dbname = "sqlite";
    if(QSqlDatabase::contains(dbname)){
        m_database = QSqlDatabase::database(dbname);
    }else{
        m_database = QSqlDatabase::addDatabase("QSQLITE",dbname);
        m_database.setHostName("localhost");
        m_database.setPort(0);
        m_database.setUserName("root");
        m_database.setPassword("root");
        dbPath.replace('\\','/');
        m_database.setDatabaseName(dbPath);
    }
    // 如果数据无法打开,则返回false
    if(!m_database.open()){
        QString str=m_database.lastError().text();
        QMessageBox::warning(NULL,"AOIDB",str,QMessageBox::Cancel,QMessageBox::Yes);
        return false;
    }
}

(二)VS2019+QT5.15.2工程中的调用代码
           DbDLL dbDLL;
           QString  m_databasePathStr = "E:/VSprojects/demo/DBManagement_V5152/sqlite.db";
           if(dbDLL.init(m_databasePathStr ))
           {
                  //成功!
           };

(三)报异常的现象
0x7AEB2093 (QtCore4.dll) (DBManagement_V5152.exe 中)处有未经处理的异常: 0xC0000005: 写入位置 0x7A8E4800 时发生访问冲突。
图片由于Flash插件的原因,一时没有上传成功,但在VS2019+QT5.15.2工程中报异常的那一行代码处有一个红叉,并提示有:未经处理的异常,然后是上面这句话。下面再有一个异常设置-->引发此异常类型时中断-->从以下位置引发时除外:QtCore4.dll。

(四)其它尝试

1.尝试传入QString & 引用,也一样不行。
2.换着传入QDateTime,也报一样的异常。

快速回复
限100 字节
 
上一个 下一个