程序在其他Windows机器上无法正常工作

时间:2017-08-06 08:57:32

标签: c++ qt dll qt5 qt-creator

我的应用程序出现问题,我正在尝试获取运行它的系统的所有网络配置。最终目标是找到具有最高优先级的MAC地址。

代码运行正常,当我使用QtCreator运行它时,当我创建包含dll文件和exe文件的文件夹时运行正常。

但问题是,当我在其他Windows机器(7和10)上运行此程序时,它会运行,但不会返回或显示任何内容。我尝试以管理员身份运行它,但它既不能正常工作,也不能在所有Windows平台上运行。

有什么建议吗?

我目前正在 Windows 10 并使用 Qt 5.8 MSVC 2015

exe文件在Windows 10上运行这些dll:

  • Qt5Core.dll
  • Qt5Network.dll
  • msvcp140.dll
  • msvcr120.dll
  • vcruntime140.dll

这些dll也适用于Windows 7:

  • API-MS-双赢芯文件l1-2-0.dll
  • API-MS-双赢芯文件l2-1-0.dll
  • API-MS-双赢芯定位-l1-2-0.dll
  • API-MS-双赢芯processthreads-l1-1-1.dll
  • API-MS-双赢芯绳l1-1-0.dll
  • API-MS-双赢芯同步-l1-2-0.dll
  • API-MS-双赢芯时区-l1-1-0.dll
  • API-MS-双赢CRT-转换-l1-1-0.dll
  • API-MS-双赢CRT-环境l1-1-0.dll
  • API-MS-双赢CRT-文件系统l1-1-0.dll
  • API-MS-双赢CRT-堆l1-1-0.dll
  • API-MS-双赢CRT-区域设置l1-1-0.dll
  • API-MS-双赢CRT-数学l1-1-0.dll
  • API-MS-双赢CRT-多字节l1-1-0.dll
  • API-MS-双赢CRT-运行时l1-1-0.dll
  • API-MS-双赢CRT-标准输入输出-l1-1-0.dll
  • API-MS-双赢CRT-字符串l1-1-0.dll
  • API-MS-双赢CRT-时间l1-1-0.dll
  • API-MS-双赢CRT-公用事业l1-1-0.dll

下面的链接是exe和dll文件:

https://ufile.io/e9htu

如果需要,这是我的代码:

的main.cpp

#include <QCoreApplication>
#include "macfinder.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    MACFinder macFinder;
    macFinder.findMAC();
    return a.exec();
}

macfinder.h

#ifndef MACFINDER_H
#define MACFINDER_H

#include <QObject>
#include <QNetworkConfiguration>
#include <QNetworkConfigurationManager>
#include <QNetworkInterface>
#include <QNetworkSession>
#include <QDebug>

class MACFinder : public QObject
{
    Q_OBJECT
public:
    explicit MACFinder(QObject *parent = 0);
    void findMAC();
private:
    QNetworkConfigurationManager ncm;
    QString filterMAC(QList<QNetworkConfiguration> configs);

signals:
    void foundMAC(QString MAC);
private slots:
    void configurationsUpdateCompleted();
};

#endif // MACFINDER_H

macfinder.cpp

#include "macfinder.h"

MACFinder::MACFinder(QObject *parent) : QObject(parent)
{
}

QString MACFinder::filterMAC(QList<QNetworkConfiguration> configs)
{
    qDebug() << "MAC and Index: ";
    QString MAC;
    int index;
    QNetworkConfiguration nc;
    foreach(nc,configs)
    {
        QNetworkSession networkSession(nc);
        QNetworkInterface netInterface = networkSession.interface();
        QString debugStr = QString::number(netInterface.index())
                + " | " + netInterface.humanReadableName() + " | "
                + nc.name() + " | " + netInterface.hardwareAddress();
        if(netInterface.hardwareAddress().isEmpty())
        {
            qDebug() << "--> No MAC: " << debugStr;
            continue;
        }
        if(netInterface.name().isEmpty())
        {
            qDebug() << "--> NO NAME: " << debugStr;
            continue;
        }
        if(netInterface.index() == 0)
        {
            qDebug() << "--> NO INDEX: " << debugStr;
            continue;
        }
        if(netInterface.flags() & QNetworkInterface::IsLoopBack)
        {
            qDebug() << "--> loopBack: " << debugStr;
            continue;
        }
        if(netInterface.flags() & (QNetworkInterface::IsRunning | QNetworkInterface::IsUp))
        {
            qDebug() << "*** Accepted: " << debugStr;
            if(MAC.isEmpty())
            {
                qDebug() << "setting MAC:" << debugStr;
                MAC = netInterface.hardwareAddress();
                index = netInterface.index();
            }
            else
            {
                if(netInterface.index() < index)
                {
                    qDebug() << "setting MAC:" << debugStr;
                    MAC = netInterface.hardwareAddress();
                    index = netInterface.index();
                }
                else
                    qDebug() << "index is not lower: " << debugStr;
            }
        }
    }
    return MAC;
}

void MACFinder::findMAC()
{
    qDebug() << "MACFinder::findMAC | updating all configurations";
    connect(&ncm,SIGNAL(updateCompleted()),this,SLOT(configurationsUpdateCompleted()));
    ncm.updateConfigurations();
}

void MACFinder::configurationsUpdateCompleted()
{
    qDebug() << "MACFinder::configurationsUpdateCompleted";
    disconnect(&ncm,SIGNAL(updateCompleted()),this,SLOT(configurationsUpdateCompleted()));
    QNetworkConfiguration nc;
    QList<QNetworkConfiguration> configs = ncm.allConfigurations(QNetworkConfiguration::Active);
    qDebug() << "\nAllConfigs: ";
    foreach (nc,configs)
    {
        qDebug() << nc.identifier() << nc.name() << nc.state();
    }
    QString MAC = filterMAC(configs);
    qDebug() << "\nMAC:" << MAC;
    if(MAC.isEmpty())
    {
        qDebug("no MAC address found");
    }
    emit foundMAC(MAC);
}

1 个答案:

答案 0 :(得分:3)

我下载了您的应用并在我的计算机上进行分析。

问题是你错过了一些dll,你的应用运行没有错误但不能正常工作。 (qgenericbearer.dll,文件夹qnativewifibearer.dll的{​​{1}}丢失了。)

您可以使用windeploy命令部署项目。

转到操作系统上的Qt编译器目录,例如:

bearer

Screenshot1

C:\Qt\Qt5.7.0\5.7\msvc2013\bin 然后按Shift+right click mouse

键入windeployqt.exe c:\您的应用目录,例如:

click open command window here

Screenshot2

现在有些dll会复制到你的app目录。

现在再试一次你的应用,你就会看到它的工作。

您可以下载应用的部署here