How to add third party library .DLL in QT project
-
Hi,
I want to add third party .dll file in my project. and call exposed function from qt program. I am running QT 5.4 on windows 8.1.
"Add library" feature in QT opens a form. then asks for type of library (internal, external or system). if we pick external it goes to next screen but provides .lib and .a file as acceptable extensions NOT .DLL
How can we add .dll in our QT project in windows environment and use it. (Call exposed functions of .DLL from QT program).
Thanks
Muhammad Sarfraz -
Hi, welcome to devnet.
To link to external library you either need the .dll, the .lib/.a and the header, in which case you use the above wizard, or use "QLibrary":http://doc.qt.io/qt-5/qlibrary.html to load the .dll dynamically and resolve entry points manually.
-
-
Hi and welcome to devnet,
If you want to link against your 3rd party library, then it's either the lib or a files. You don't link against dlls
-
if you use the wizard like already mentioned you link against this DLL file as an dependency.
Meaning your application can't even start without it and automatically loads it if it's found or displays an error message if not. -
Hi, just tested using a 3rd party DLL with Qt, it's pretty straightforward:
I choose to test an old DLL present in Windows XP for the FreeCell game, called cards.dll, if you don't have Windows XP you can download the dll "here":http://www.dlldump.com/download-dll-files_new.php/dllfiles/C/cards.dll/5.1.2600.0/download.html The site looks suspicious but I checked, if you click to the right (Click Here to Download cards.zip) you'll get the exact same cards.dll that's in C:\Windows\System32 in Windows XP.For this example I put cards.dll in C:\Downloads. Also you need to know about the function(s) you are calling, in this case I googled for a description of the functions inside cards.dll, I use 2: cdtInit and cdtDraw.
Create a new Widgets app, first insert CONFIG += c++11 in your .pro file to turn on C++11 features, then goto your mainwindow.cpp, insert these includes:
@
#include "QLibrary"
#include "QTimer"
#include "windows.h"
@then below ui->setupUi(this); insert this fancy code:
@
((int (WINAPI*)(int*,int*)) QLibrary("C:/Downloads/cards.dll").resolve("cdtInit"))(new int, new int);
QTimer* pTimer = new QTimer(this);
pTimer->start(500);
connect(pTimer,&QTimer::timeout,
{
auto GetDC = (int (WINAPI *)(int)) QLibrary("user32.dll").resolve("GetDC");
auto cdtDraw = (int (WINAPI *)(int,int,int,int,int,int)) QLibrary("C:/Downloads/cards.dll").resolve("cdtDraw");
cdtDraw(GetDC(0),rand() % 1000,rand() % 1000,rand() % 52,0,0);
});
@If you do it right you'll get lots of cards drawn on your screen like this: !http://www.tripleboot.org/Pictures/DLLTest.png(Lots of cards)!
-
I just want to add that normally you do not use random 3rd party dll.
If you are legally allowed to use it you will have access to headers files you need and associated lib files or would be able to build them.That means that you do not need to use QLibrary or in other way to resolve calls. you will include appropriate header and link against appropriate lib file
Dll and call functions like they were in your module. Dll will be loaded by your exe at runtime. You will have to provide it with your code. -
I agree with the random part however, that technique is perfectly fine otherwise and Qt uses it for e.g. OpenSSL by default
-
-
No you can't that dll uses Win32 specific API