为什么动态加载库会使我的应用崩溃?

时间:2020-07-23 07:03:44

标签: c++ qt loadlibrary

我有一个非常简单的Qt 5.12.0 / VS2015程序,该程序加载了一个第三方库(来自https://www.tec-microsystems.com/downloads.html的“ DX5100 API / DLL for C ++”中的DX5100_v2.dll),该程序在Win10下运行。

代码如下:

#include <QPushButton>
#include <QStyle>
#include <QDialog>
#include <QApplication>

#include <objbase.h>

int main( int argc, char* argv[] )
{
    QApplication app( argc, argv );

    HMODULE handle = LoadLibrary( "DX5100_v2.dll" );

    QDialog dlg;
    dlg.setWindowIcon( qApp->style()->standardIcon( QStyle::SP_MessageBoxInformation ) );
    dlg.show();

    return app.exec();
}

这会导致报告带有堆栈的“ 0xC0000090:浮点无效操作”崩溃

>   Qt5Guid.dll!reciprocal_mul_ps(__m128 a, float mul) Ligne 101    C++
    Qt5Guid.dll!convertARGBFromARGB32PM_sse4<0,0>(unsigned int * buffer, const unsigned int * src, int count) Ligne 122 C++
    Qt5Guid.dll!storeARGB32FromARGB32PM_sse4(unsigned char * dest, const unsigned int * src, int index, int count, const QVector<unsigned int> * __formal, QDitherInfo * __formal) Ligne 298    C++
    Qt5Guid.dll!convert_generic(QImageData * dest, const QImageData * src, QFlags<enum Qt::ImageConversionFlag> flags) Ligne 217    C++
    Qt5Guid.dll!QImage::convertToFormat_helper(QImage::Format format, QFlags<enum Qt::ImageConversionFlag> flags) Ligne 2091    C++
    Qt5Guid.dll!QImage::convertToFormat(QImage::Format f, QFlags<enum Qt::ImageConversionFlag> flags) Ligne 188 C++
    Qt5Guid.dll!qt_imageToWinHBITMAP(const QImage & imageIn, int hbitmapFormat) Ligne 280   C++
    Qt5Guid.dll!qt_pixmapToWinHBITMAP(const QPixmap & p, int hbitmapFormat) Ligne 360   C++
    Qt5Guid.dll!qt_pixmapToWinHICON(const QPixmap & p) Ligne 469    C++
    qwindowsd.dll!createHIcon(const QIcon & icon, int xSize, int ySize) Ligne 2642  C++
    qwindowsd.dll!QWindowsWindow::setWindowIcon(const QIcon & icon) Ligne 2652  C++
    Qt5Guid.dll!QWindow::setIcon(const QIcon & icon) Ligne 1000 C++
    Qt5Widgetsd.dll!QWidgetPrivate::setWindowIcon_sys() Ligne 6209  C++
    Qt5Widgetsd.dll!QWidget::create(unsigned __int64 window, bool initializeWindow, bool destroyOldWindow) Ligne 1359   C++
    Qt5Widgetsd.dll!QWidget::setVisible(bool visible) Ligne 8274    C++
    Qt5Widgetsd.dll!QDialog::setVisible(bool visible) Ligne 739 C++
    Qt5Widgetsd.dll!QWidget::show() Ligne 7875  C++
    dx5100_load_crash.exe!main(int argc, char * * argv) Ligne 18    C++
    dx5100_load_crash.exe!WinMain(HINSTANCE__ * __formal, HINSTANCE__ * __formal, char * __formal, int __formal) Ligne 104  C++

还请注意,它不再崩溃:

  • 如果我删除了setWindowIcon调用....但是没有理由导致此函数导致崩溃,看起来我最终处于不稳定状态并且图标显示导致崩溃了吗?
  • 如果我删除LoadLibrary( "DX5100_v2.dll" )
  • 更令人惊讶的是,如果我生成DX5100_v2.lib文件(使用depends.exe生成DX5100_v2.def以获取功能列表,然后从VS2015命令行提示符处调用lib /def:DX5100_v2.def /machine:x64 /out:DX5100_v2.lib),然后链接至该文件(以便DX5100_v2 .dll是在启动时加载的,甚至在执行主入口点之前也已加载)...不会崩溃。

0 个答案:

没有答案