日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

加载dll、lib库(例子的代码很全)

發布時間:2023/12/19 综合教程 20 生活家
生活随笔 收集整理的這篇文章主要介紹了 加载dll、lib库(例子的代码很全) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

是關于如何加載dll或lib庫的。可以看這篇bog Qt調用dll中的功能函數點擊打開鏈接

****************************************************************************************************************************************************

聲明:事先我已經自己動手寫了一個簡單的dll文件(myDLL.dll),C版接口的。并且用我前兩篇有關DLL文章里面的方法,從dll中導出了導入庫(.lib)文件,dll中有兩個函數,原型如下:

voidHelloWorld(); //函數內部調用Win32 API,功能是彈出一個helloworld提示框intadd(inta,intb); //實現兩個數相加,并返回結果

下面分別通過顯示調用和隱式調用兩種方法,來模擬Qt如何調用外部dll文件中的功能函數,follow me....

預備知識:

1、如果在沒有導入庫文件(.lib),而只有頭文件(.h)與動態鏈接庫(.dll)時,我們才需要顯示調用,如果這三個文件都全的話,我們就可以使用簡單方便的隱式調用。

2、通常Windows下程序顯示調用dll的步驟分為三步(三個函數):LoadLibrary()、GetProcAdress()、FreeLibrary()

其中,LoadLibrary() 函數用來載入指定的dll文件,加載到調用程序的內存中(DLL沒有自己的內存!)

GetProcAddress() 函數檢索指定的動態鏈接庫(DLL)中的輸出庫函數地址,以備調用

FreeLibrary() 釋放dll所占空間

1、顯示調用

Qt提供了一個 QLibrary 類供顯示調用。下面給出一個完整的例子:

[cpp]view plaincopy

#include<QApplication>
#include<QLibrary>
#include<QDebug>
#include<QMessageBox>
#include"dll.h"http://引入頭文件
typedefint(*Fun)(int,int);//定義函數指針,以備調用
intmain(intargc,char**argv)
{
QApplicationapp(argc,argv);
QLibrarymylib("myDLL.dll");//聲明所用到的dll文件
intresult;
if(mylib.load())//判斷是否正確加載
{
QMessageBox::information(NULL,"OK","DLLloadisOK!");
Funopen=(Fun)mylib.resolve("add");//援引add()函數
if(open)//是否成功連接上add()函數
{
QMessageBox::information(NULL,"OK","LinktoFunctionisOK!");
result=open(5,6);//這里函數指針調用dll中的add()函數
qDebug()<<result;
}
else
QMessageBox::information(NULL,"NO","LinketoFunctionisnotOK!!!!");
}
else
QMessageBox::information(NULL,"NO","DLLisnotloaded!");
return0;//加載失敗則退出28}

myDLL.dll為自定義的dll文件,將其復制到程序的輸出目錄下就可以調用。顯然,顯示調用代碼書寫量巨大,實在不方便。

2、隱式調用

這個時候我們需要三個文件,頭文件(.h)、導入庫文件(.lib)、動態鏈接庫(.dll),具體步驟如下:

1、首先我們把 .h 與 .lib/.a 文件復制到程序當前目錄下,然后再把dll文件復制到程序的輸出目錄,

2、下面我們在pro文件中,添加 .lib 文件的位置:LIBS+=-LD:/hitempt/api/-lmyDLL

-L 參數指定 .lib/.a 文件的位置

-l 參數指定導入庫文件名(不要加擴展名)

另外,導入庫文件的路徑中,反斜杠用的是向右傾斜的

3、在程序中include頭文件(我試驗用的dll是用C寫的,因此要用extern "C" { #include "dll.h" })

下面是隱式調用的實例代碼:

[cpp]view plaincopy

#include<QApplication>
#include<QDebug>
extern"C"http://由于是C版的dll文件,在C++中引入其頭文件要加extern"C"{},注意
{
#include"dll.h"
}
intmain(intargv,char**argv)
{
QApplicationapp(argv,argv);
HelloWordl();//調用Win32API彈出helloworld對話框
qDebug()<<add(5,6);//dll中我自己寫的一個加法函數
return0;//完成使命后,直接退出,不讓它進入事件循環
}

************************************************************************************************************************************

本來是打算用隱身調用的,但是可能是庫的原因,造成無法使用。庫是別的公司提供的。so,用的第一種。在后面會貼一些我的code。

jida.h 部分 函數形成如下

[cpp]view plaincopy

BOOLWINAPIJidaDllInstall(BOOLinstall);
BOOLWINAPIJidaDllInitialize(void);
BOOLWINAPIJidaDllUninitialize(void);

DWORDWINAPIJidaBoardCountW(LPCWSTRpszClass,DWORDdwFlags);
BOOLWINAPIJidaBoardOpenW(LPCWSTRpszClass,DWORDdwNum,DWORDdwFlags,/*@out@*/PHJIDAphJida);
BOOLWINAPIJidaBoardClose(HJIDAhJida);

DWORDWINAPIJidaI2CCount(HJIDAhJida);
DWORDWINAPIJidaI2CType(HJIDAhJida,DWORDdwType);
BOOLWINAPIJidaI2CRead(HJIDAhJida,DWORDdwType,BYTEbAddr,LPBYTEpBytes,DWORDdwLen);
BOOLWINAPIJidaI2CWrite(HJIDAhJida,DWORDdwType,BYTEbAddr,LPBYTEpBytes,DWORDdwLen);

在要加載的cpp文件上寫上QT,因為dll是window的,里面含有定義的宏DWORD這類,so加上windows.h

[cpp]view plaincopy

#include<windows.h>
#include<QLibrary>
#include"jida.h"


定義指針函數以備調用如:一個add函數。下面第一行為函數,第二行為函數指針。

[cpp]view plaincopy

//intadd(inta,intb);
//typedefint(*Fun)(int,int);//定義函數指針,以備調用


下面是我的main.cpp里面的。第一行pHandle是給dll的函數里面的api接口,不同dll接口不同,請忽略,不用在意。

主要是dll的加載。QLibrary jida_lib("jida.dll");

然后引用dll里面的函數。resolve是加載dll里面的函數。括號里面的(JidaDallInstall)是Dell里面的函數名。然后直接調用jida_install即可使用dll里面的JidaDallInstall函數。jida_install是自己自定義的。

[cpp]view plaincopy

//加載dll函數
FunJidaInstaljida_install=(FunJidaInstal)jida_lib.resolve("JidaDllInstall");//引用dll里面的JidaDllInstall()函數

DWORD pHandle = 0; //句柄返回值

[cpp]view plaincopy

//intadd(inta,intb);
//typedefint(*Fun)(int,int);//定義函數指針,以備調用

//dllinituninit
typedefBOOLWINAPI(*FunJidaInstal)(BOOLinstall);//BOOLWINAPIJidaDllInstall(BOOLinstall);
typedefBOOLWINAPI(*FunJidaDllInit)(BOOLinstall);//BOOLWINAPIJidaDllInitialize(void);
typedefBOOLWINAPI(*FunJidaDllUninit)(BOOLinstall);//BOOLWINAPIJidaDllUninitialize(void);
//板子
typedefDWORDWINAPI(*FunJidaBoardCountW)(LPCWSTR,DWORD);//DWORDWINAPIJidaBoardCountW(LPCWSTRpszClass,DWORDdwFlags);板子數
typedefBOOLWINAPI(*FunJidaBoardOpenW)(LPCWSTR,DWORD,DWORD,PHJIDA);//打開板子BOOLWINAPIJidaBoardOpenW(LPCWSTRpszClass,DWORDdwNum,DWORDdwFlags,/*@out@*/PHJIDAphJida);
typedefBOOLWINAPI(*FunJidaBoardClose)(HJIDAhJida);//BOOLWINAPIJidaBoardClose(HJIDAhJida);板子關閉
//I2C
typedefDWORDWINAPI(*FunJidaI2CCount)(HJIDA);//DWORDWINAPIJidaI2CCount(HJIDAhJida);
typedefDWORDWINAPI(*FunJidaI2CType)(HJIDA,DWORD);//DWORDWINAPIJidaI2CType(HJIDAhJida,DWORDdwType);
typedefBOOLWINAPI(*FunJidaI2CRead)(HJIDA,DWORD,BYTE,LPBYTE,DWORD);//BOOLWINAPIJidaI2CRead(HJIDAhJida,DWORDdwType,BYTEbAddr,LPBYTEpBytes,DWORDdwLen);
typedefBOOLWINAPI(*FunJidaI2CWrite)(HJIDA,DWORD,BYTE,LPBYTE,DWORD);//BOOLWINAPIJidaI2CWrite(HJIDAhJida,DWORDdwType,BYTEbAddr,LPBYTEpBytes,DWORDdwLen);

//聲明所用到的dll文件
QLibraryjida_lib("jida.dll");
//加載dll函數
FunJidaInstaljida_install=(FunJidaInstal)jida_lib.resolve("JidaDllInstall");//引用dll里面的JidaDllInstall()函數
FunJidaDllInitjida_dll_init=(FunJidaDllInit)jida_lib.resolve("JidaDllInitialize");
FunJidaDllUninitjida_dll_uninit=(FunJidaDllUninit)jida_lib.resolve("JidaDllUninitialize");
FunJidaBoardCountWjida_board_countw=(FunJidaBoardCountW)jida_lib.resolve("JidaBoardCountW");
FunJidaBoardOpenWjida_board_openw=(FunJidaBoardOpenW)jida_lib.resolve("JidaBoardOpenW");
FunJidaBoardClosejida_board_close=(FunJidaBoardClose)jida_lib.resolve("JidaBoardClose");
FunJidaI2CCountjida_i2c_count=(FunJidaI2CCount)jida_lib.resolve("JidaI2CCount");
FunJidaI2CTypejida_i2c_type=(FunJidaI2CType)jida_lib.resolve("JidaI2CType");
FunJidaI2CReadjida_i2c_read=(FunJidaI2CRead)jida_lib.resolve("JidaI2CRead");
FunJidaI2CWritejida_i2c_write=(FunJidaI2CWrite)jida_lib.resolve("JidaI2CWrite");

進行下簡單的判斷,dll是否加載成功。.load是加載dll。jida_install是我調用dll里面的dll初始化程序。

等于是調用dll里面的函數,再次看是否加載ok。

[cpp]view plaincopy

if(jida_lib.load())//判斷是否正確加載
{
cout<<"qtlibloadok"<<endl;
}
else
{
cout<<"qtlibloaderror"<<endl;
}

if(jida_install)
{
cout<<"dellloadok"<<endl;
}
else
{
cout<<"dellloaderror"<<endl;
}

http://blog.csdn.net/linbounconstraint/article/details/47321103

總結

以上是生活随笔為你收集整理的加载dll、lib库(例子的代码很全)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。