DLL怎么调用另一个DLL
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DLL怎么调用另一个DLL相关的知识,希望对你有一定的参考价值。
调用DLL有两种方法:静态调用和动态调用.(一).静态调用其步骤如下:
1.把你的youApp.DLL拷到你目标工程(需调用youApp.DLL的工程)的Debug目录下;
2.把你的youApp.lib拷到你目标工程(需调用youApp.DLL的工程)目录下;
3.把你的youApp.h(包含输出函数的定义)拷到你目标工程(需调用youApp.DLL的工程)目录下;
4.打开你的目标工程选中工程,选择Visual C++的Project主菜单的Settings菜单;
5.执行第4步后,VC将会弹出一个对话框,在对话框的多页显示控件中选择Link页。然后在Object/library modules输入框中输入:youApp.lib
6.选择你的目标工程Head Files加入:youApp.h文件;
7.最后在你目标工程(*.cpp,需要调用DLL中的函数)中包含你的:#include "youApp.h"
注:youApp是你DLL的工程名。
(二).动态调用其程序如下:
动态调用时只需做静态调用步骤1.
01
02 HINSTANCE hDllInst = LoadLibrary("youApp.DLL");
03 if(hDllInst)
04
05 typedef DWORD (WINAPI *MYFUNC)(DWORD,DWORD);
06 MYFUNC youFuntionNameAlias = NULL;
07 // youFuntionNameAlias 函数别名
08 youFuntionNameAlias = (MYFUNC)GetProcAddress(hDllInst,"youFuntionName");
09 // youFuntionName 在DLL中声明的函数名
10 if(youFuntionNameAlias)
11
12 youFuntionNameAlias(param1,param2);
13
14 FreeLibrary(hDllInst);
15
16
显式(静态)调用:
LIB + DLL + .H,注意.H中dllexport改为dllimport
隐式(动态)调用:
DLL + 函数原型声明,先LoadLibrary,再GetProcAddress(即找到DLL中函数的地址),不用后FreeLibrary 参考技术A dll文件一般被存放在C:\Windows\System目录下。电脑系统文件因经常会受到病毒的侵扰,导致系统文件、dll文件等丢失、损坏,一些包括游戏在内的应用程序无法启动。
解决方法有:
1、用Windows系统盘功能进行文件修复;
2、若在此之前有一键备份过,可以重新还原;
3、从网上下载系统文件然后覆盖到原文件夹里;
4、由于从网上下载系统文件,可能会因为系统文件版本与操作系统不相符造成系统文件不兼容的情况,修复系统文件最好使用专业的工具进行一键修复。
5、可以用腾讯电脑管家修复下。打开电脑管家——电脑诊所——软件问题——缺少dll文件。 参考技术B 各种load****第一个参数用dll实例句柄即可
如何从 Qt 中的另一个应用程序调用 DLL
【中文标题】如何从 Qt 中的另一个应用程序调用 DLL【英文标题】:How to call DLL from another application in Qt 【发布时间】:2016-07-07 11:01:45 【问题描述】:我是 Qt 开发和开发启动 TCP Server 的 Qt DLL 的新手。当我从另一个应用程序调用 dll 时,它不会收到任何新的连接套接字。 所以如果我做错了步骤,请指导我。
服务器.h
extern "C" SERVERSHARED_EXPORT void CallServer();
class SERVERSHARED_EXPORT Server : public QObject
Q_OBJECT
public:
Server();
void CallServer();
void CallServer1();
QTcpServer *server;
QTcpSocket *socket ;
signals:
public slots:
void myConnection();
void closingClient();
;
服务器.cpp
Server::Server()
void CallServer()
Server server_Obj;
server_Obj.CallServer1();
while (true)
::sleep(1000);
void Server::CallServer1()
server = new QTcpServer(this);
connect(server, SIGNAL(newConnection()),this, SLOT(myConnection()));
QHostAddress hostadd(ServerIP);
qDebug() << ServerIP;
qDebug() << Port;
if(!server->listen(hostadd,Port.toInt())) qDebug() << "\nWeb server could not start";
else qDebug() <<"\nWeb server is waiting for a connection";
void Server::myConnection()
qDebug() << "Detected Connection";
QByteArray Rdata;
socket = server->nextPendingConnection();
qDebug() << "Wait for connect = " << socket->waitForConnected();
while (socket->waitForReadyRead(10))
while(socket->bytesAvailable() > 0)
Rdata.append(socket->readAll());
qDebug() << "Final Testing is size = " << Rdata.size();
qDebug() << "Final Testing is" << Rdata;
.pro 文件
QT += core
QT += network
QT += widgets
QT -= gui
TARGET = Server
TEMPLATE = lib
DEFINES += SERVER_LIBRARY
SOURCES += server.cpp
HEADERS += server.h\
server_global.h
另一个应用程序:
int main(int argc, char *argv[])
QCoreApplication a(argc, argv);
QLibrary library("Server.dll");
if (!library.load())
qDebug() << library.errorString();
if (library.load())
qDebug() << "library loaded";
typedef int(*pf)(void);
pf cwf = (pf)library.resolve("CallServer");
if (cwf)
int x = cwf();
else
qDebug() << "Could not show widget from the loaded library";
qDebug() << "After call";
return a.exec();
【问题讨论】:
所以你称它为 "qt" 和 "QT",并且不知何故明确遗漏了正确的拼写:"Qt" 。祝你好运,如果这是你愿意付出的努力。 您的代码中有一个无限的sleep
调用循环。
添加睡眠是因为我想检查服务器是否正在运行,否则它会返回。
我不认为sleep
做你认为它做的事。您的循环没有退出点;它只是无限期地休眠。
但是如果我删除睡眠然后调用返回并且服务器不再处于监听模式。我想建议我如何使用加载 dll 从另一个应用程序调用服务器。抱歉英语不太好。
【参考方案1】:
看起来它不起作用,因为您在没有事件循环的情况下以异步(信号/插槽)方式使用 QTcpSocket(您的服务器类) - 所以它不起作用。您应该添加事件循环或以阻塞方式使用套接字。有关更多详细信息,请查看 - http://doc.qt.io/qt-5/qtnetwork-blockingfortuneclient-example.html
【讨论】:
以上是关于DLL怎么调用另一个DLL的主要内容,如果未能解决你的问题,请参考以下文章
从另一个 C# DotNet DLL 动态加载和调用 C# DotNet DLL