如何从 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的主要内容,如果未能解决你的问题,请参考以下文章

从 Qt (c++) 调用 DLL 中的函数

在非 Qt 应用程序中使用基于 Qt 的 DLL

如何让 VBA 子例程调用将数组传递给子例程中的另一个函数的函数

从qt中的另一个线程运行qtconcurrent时如何关闭程序

从 QT 的 MainWindow 中的另一个函数更新标签

如何从 Flutter(Dart) 中的另一个类调用方法?