2016-07-07 4 views
-1

私はQt開発で新しく、TCP Serverを起動するQt DLLを開発しています。私は別のアプリケーションからdllを呼び出すときに、新しい接続ソケットを受け取りません。 私は何か間違った手順をしている場合は私を案内してください。Qtで別のアプリケーションからDLLを呼び出す方法

Server.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(); 
}; 

Server.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 

別のApp:

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(); 
} 
+0

と書いてありますので、* qt *と* QT *と呼んで、何らかの形で正しいスペルを断念しています:* "Qt" *。幸いです、それがあなたが投資したい勤勉さの量ならば。 – IInspectable

+0

あなたのコードに無限の 'sleep'コールループがあります。 –

+0

サーバが動作しているかどうかチェックしたいのでスリープが追加されます。 – HAC

答えて

0

QTcpSocket(サーバークラス)をイベントループなしで非同期(シグナル/スロット)の方法で使用しているため動作していないように見えます。動作しません。イベントループを追加するか、ソケットをブロックして使用する必要があります。詳細については、http://doc.qt.io/qt-5/qtnetwork-blockingfortuneclient-example.html

関連する問題