Qt - Dll相关问题

时间:2011-05-27 13:25:00

标签: c++ windows qt dll logic

我只是在学习dll的。我在Qt尝试过。首先,我发布了与dll相关的文件。

第一个dll - 专业档案

TEMPLATE = lib

SOURCES += \
    check.cpp

HEADERS += \
    check.h

这是dll-头文件“check.h”

#ifndef CHECK_H
#define CHECK_H

#include <iostream>

extern "C++" __declspec(dllexport) std::string check();

#endif // CHECK_H

这个是dll - 源文件“check.cpp”

#include <iostream>
#include "check.h"

extern "C++" __declspec(dllexport) std::string check()
{
    return "dll applied";
}

我编译了上面的项目文件,得到了dll。 dll的名字是“dll.dll”

现在是主文件。在这里,我尝试通过dll访问“检查”功能。

#include "check.h"
#include <iostream>
#include "MyMessageBox.h"
#include <QApplication>
#include <QLibrary>
#include <QMessageBox>

typedef std::string (*CheckType) (void);

class MyMessageBox:public QMessageBox
{
public:
    MyMessageBox(std::string message,QWidget*parent=0):
       QMessageBox(QMessageBox::NoIcon,QString("ErrorMessage"),QString(message.c_str()),QMessageBox::Ok,parent,Qt::Widget)
    {
    }
};

int main(int argc,char * argv[])
{
    QApplication app(argc,argv);
    CheckType myCheck;
    QLibrary myLib("dll");
    myLib.load();

    bool ok = myLib.load();
    if(ok)
    {
        MyMessageBox mm("Load is done");
        mm.exec();
    }
    ok = myLib.isLoaded();
    if(ok)
    {
        MyMessageBox mm("Loaded");
        mm.exec();
    }
    myCheck = (CheckType) (myLib.resolve("check"));
    if(!myCheck)
    {
        MyMessageBox m0("Resolving isn't happened");
        m0.exec();
    }
    std::string result = myCheck();

    MyMessageBox mm(result);
    mm.exec();
    return app.exec();
}

但是当我运行上述应用程序时,我得到了“解决不会发生”。这意味着,函数指针变为NULL。我不知道哪个部分是错的。有人帮帮我吗?

1 个答案:

答案 0 :(得分:6)

使用DLL编译程序时,需要__declspec(dllimport)。一种常见的方法是:

// Windows DLL magic
#if defined(USE_DLL)
# if defined(BUILD_DLL)
#  define DLL_EXPORT  __declspec(dllexport)
# else // BUILD_DLL
#  define DLL_EXPORT  __declspec(dllimport)
# endif // BUILD_DLL
#else // USE_DLL
# define DLL_EXPORT
#endif // USE_DLL

然后,您将示例中的__declspec(dllexport)替换为DLL_EXPORT,并确保在任何导出符号之前包含上述代码。

然后添加

DEFINES += USE_DLL BUILD_DLL

到dll的项目文件(当然只在构建为dll时)和

DEFINES += USE_DLL

使用dll导出函数的任何项目。这很丑陋,但惯用而且很有效。