Qt - DLL 相关问题

3
我正在学习dll。我在Qt中尝试过。首先,我会发布与dll相关的文件。
第一个是dll - pro文件。
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访问“check”函数。
#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个回答

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可以为任何项目提供功能。这很丑陋,但符合习惯且有效。


你是说当我编译“main”文件时,必须在“check.h”中加入__declspec(dllexport)吗? - prabhakaran
@prabhakaran:我已经澄清了你在实际代码中需要使用DLL魔法的事情。 - rubenvb
我遇到了这个错误:“文件无效或损坏:无法在0x2C0处读取”。 - prabhakaran
@prabhakaran:我无法帮助你,确保进行干净的重建。出现这样的错误可能是其他问题导致的,与我回答的问题无关。 - rubenvb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接