pra*_*ran 3 c++ windows dll logic qt
我只是在学习dll的.我在Qt尝试过.首先我发布dll相关文件.
第一个dll - pro文件
TEMPLATE = lib
SOURCES += \
check.cpp
HEADERS += \
check.h
Run Code Online (Sandbox Code Playgroud)
这个是dll-头文件"check.h"
#ifndef CHECK_H
#define CHECK_H
#include <iostream>
extern "C++" __declspec(dllexport) std::string check();
#endif // CHECK_H
Run Code Online (Sandbox Code Playgroud)
这个是dll - 源文件"check.cpp"
#include <iostream>
#include "check.h"
extern "C++" __declspec(dllexport) std::string check()
{
return "dll applied";
}
Run Code Online (Sandbox Code Playgroud)
我编译了上面的项目文件,得到了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();
}
Run Code Online (Sandbox Code Playgroud)
但是当我运行上述应用程序时,我得到了"解决不会发生".这意味着,函数指针变为NULL.我不知道哪个部分是错的.来人帮帮我?
使用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
Run Code Online (Sandbox Code Playgroud)
然后,__declspec(dllexport)
在您的示例中替换DLL_EXPORT
,并确保在任何导出的符号之前包含上述代码.
然后你添加
DEFINES += USE_DLL BUILD_DLL
Run Code Online (Sandbox Code Playgroud)
到dll的项目文件(当然只有在构建为dll时!)和
DEFINES += USE_DLL
Run Code Online (Sandbox Code Playgroud)
使用dll导出函数的任何项目.这很丑陋,但惯用而且很有效.
归档时间: |
|
查看次数: |
1049 次 |
最近记录: |