LoadLibrary:在释放模式下崩溃

时间:2018-07-24 08:11:11

标签: c++ winapi release

我使用Windows API中的函数LoadLibrary动态加载DLL(以发布模式编译)。然后我调用导入的函数my_function

当我的exe编译在以下位置时:

  • 调试模式:没有问题
  • 带有调试信息的发布模式:没问题
  • 不带调试信息的发布模式:调用导入的功能LoadLibrary
  • 后,my_function调用后崩溃

这是一个代码示例:

MyClass.cpp:

#include "myclass.h" 

typedef int (__stdcall *f_my_function)(char*, int*); 

MyClass::MyClass()
{
    mDllHandler = NULL;
}

bool MyClass::loadLibrary()
{

    qCritical() << "Loading library";
    mDllHandler = LoadLibrary(L"my.dll");
    qCritical() << "Library loaded";

    if (!mDllHandler) {
        qCritical() << "Error : could not load my.dll";
        return false;
    }

    return true;
}

bool MyClass::freeLibrary()
{
    if(!mDllHandler) {
        qCritical() << "Error : DLL handler is null";
        return false;
    }
    if(!FreeLibrary(mDllHandler)) {
        qCritical() << "Error : could not unload my.dll";
        return false;
    }
    mDllHandler = NULL;

    return true;
}

bool MyClass::myFunction(const& QString str)
{
    if(!mDllHandler) {
        qCritical() << "Error : DLL handler is null";
        return false;
    }
    f_my_function my_function = (f_my_function)GetProcAddress(mDllHandler, "my_function");
    if (!my_function) {
        qCritical() << "Error : Could not resolve the function my_function";
        return false;
    }

    int size = str.size();
    char* string = str.toLatin1().data();

    int error = my_function(string, &size);

    qDebug() << "my_function : Error code is " << error;

    return !error;
}

MyClass.h:

#ifndef MYCLASS_H
#define MYCLASS_H

#include <QString>

class MyClass
{

public:
    MyClass();
    bool loadLibrary();
    bool freeLibrary();
    bool myFunction(const QString& str = "");


private:
    HINSTANCE mDllHandler;


};

#endif // MYCLASS_H

main.cpp

#include <QCoreApplication>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    MyClass myClass;

    myClass.loadLibrary();
    myClass.myFunction();
    myClass.freeLibrary();

    return a.exec();

}

我真的不知道为什么它在这里崩溃。

编辑:在这里,我无权访问my.dll的源代码。

1 个答案:

答案 0 :(得分:-1)

好吧,崩溃(最终并非总是在LoadLibrary调用中发生,但有时在代码稍后出现)是由于导入函数的声明错误造成的。

在MyClass.cpp中:

错误的声明:

typedef int (__stdcall *f_my_function)(char*, int*);

正确的声明:

typedef int (*f_my_function)(char*, int*);

事实上,我用f_my_function错误地声明了__stdcall