如题。
我有一个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,也报一样的异常。