3
我剛剛瞭解了dll的。我在Qt中試過。首先,我發佈了與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。我不知道哪部分是錯的。來人幫幫我?
你是說我必須把__declspec(dllexport)放在「check.h」中,當我用「main」文件編譯它時。 – prabhakaran 2011-05-27 14:28:21
@prabhakaran:我在你的真實代碼中澄清了你需要用DLL魔術做什麼。 – rubenvb 2011-05-27 14:57:14
我得到這個錯誤「invalid or corrupt file:can not read at 0x2C0」 – prabhakaran 2011-05-28 06:26:18