用QT 开发的exe执行成可以手动来测试someip ,现在想让工具可以提供外部接口给到Python 来使用,研究了一下实现方式,可以在exe的源码中增加com 接口来给到外部程序使用。
![](https://i-blog.csdnimg.cn/blog_migrate/b674192a699b60e19ef2196fd532ed5f.png)
首先我们在QT Creator 创建一个项目ActiveXTest
![](https://i-blog.csdnimg.cn/blog_migrate/e42defae2d0cf6710a3cecaf386eec9a.png)
然后一路next 就创建完成,完成后的工程文件如下:
![](https://i-blog.csdnimg.cn/blog_migrate/1fa96983183250cbdcc9b7403f93c1a5.png)
pro 文件中添加需要的module axserver
![](https://i-blog.csdnimg.cn/blog_migrate/ce16f61531f98f39f286913f91ecaaad.png)
添加一个类作为导出类,提供接口给到外部程序使用。
tam.h
#ifndef TAM_H
#define TAM_H
#include <QObject>
class TAM:public QObject
{
Q_OBJECT
Q_CLASSINFO("ClassID", "{DF16845C-92CD-4AAB-A982-EB9840E74669}")
Q_CLASSINFO("InterfaceID", "{616F620B-91C5-4410-A74E-6B81C76FFFE0}")
Q_CLASSINFO("EventsID", "{E1816BBA-BF5D-4A31-9855-D6BA432055FF}")
public:
explicit TAM(QObject *parent = nullptr);
};
#endif // TAM_H
tam.cpp
#include "tam.h"
TAM::TAM(QObject *parent)
{
Q_UNUSED(parent)
}
main.cpp添加导出
![](https://i-blog.csdnimg.cn/blog_migrate/55b3c3fa00f4a3cd5da5d6dd95401241.png)
#include "mainwindow.h"
#include <QApplication>
#include<QAxFactory>
#include "tam.h"
QAXFACTORY_BEGIN(
"{4F4E610F-E55C-4913-B02D-9D4D37B99D2B}",
"{5D58391F-071C-4E67-8874-6553FDCE560F}"
)
QAXCLASS(TAM)
QAXFACTORY_END()
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
我们的TAM 类中可以添加需要导出的接口:
#ifndef TAM_H
#define TAM_H
#include <QObject>
class TAM:public QObject
{
Q_OBJECT
Q_CLASSINFO("ClassID", "{DF16845C-92CD-4AAB-A982-EB9840E74669}")
Q_CLASSINFO("InterfaceID", "{616F620B-91C5-4410-A74E-6B81C76FFFE0}")
Q_CLASSINFO("EventsID", "{E1816BBA-BF5D-4A31-9855-D6BA432055FF}")
public:
explicit TAM(QObject *parent = nullptr);
public slots:
QString getVersion();
int add(int a,int b);
};
#endif // TAM_H
#include "tam.h"
#include<iostream>
TAM::TAM(QObject *parent)
{
Q_UNUSED(parent)
}
QString TAM::getVersion()
{
return "V1.01";
}
int TAM::add(int a,int b)
{
qDebug("sum %d",a+b);
std::cout<<a+b<<std::endl;
return a+b;
}
我们在UI 中添加几个控件来测试一下TAM 中的函数
![](https://i-blog.csdnimg.cn/blog_migrate/1bd4fb7eedc44dd33c18bed011ef3a98.png)
添加 -activex 参数:程序以Server 的方式工作
![](https://i-blog.csdnimg.cn/blog_migrate/c44942caac8dc91576491f08f1747462.png)
我们可以写一个python 脚本来验证
import win32com.client as client
import win32api
TAMObj=client.Dispatch("ActiveXTest.TAM")
print(TAMObj.getVersion())
res = TAMObj.add(100,2)
print(res)
TAMObj = None
运行脚本可以看见结果:
D:\python\install\python3.exe "D:/source code/PythonCom/ComTest.py"
V1.01
102
Process finished with exit code 0
当我们以server 运行的时候不希望UI 弹出来,我们可以在main中做一个设置
![](https://i-blog.csdnimg.cn/blog_migrate/61bd0c0afcc5d82997a5eadac2fca517.png)
这样我们python 调用com 接口的时候就不会有UI出现。
COM的相关的介绍可以参考下面的书籍:
https://download.csdn.net/download/cwei231/7583221https://download.csdn.net/download/cwei231/7583221也可以参考QT 官方文档: