如何从 Qt 中的另一个应用程序调用 DLL
Posted
技术标签:
【中文标题】如何从 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
【讨论】:
以上是关于如何从 Qt 中的另一个应用程序调用 DLL的主要内容,如果未能解决你的问题,请参考以下文章
如何让 VBA 子例程调用将数组传递给子例程中的另一个函数的函数