社区
Inventor 产品技术应用讨论区
欢迎访问欧特克Inventor论坛!分享知识,发帖提问,浏览Inventor热帖
取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 

无法通过Qt com组件获取inventor api

14 条回复14
回复
1 条消息(共 15 条)
858456055
1574 次查看, 14 条回复

无法通过Qt com组件获取inventor api

我的代码是这样的:

#include <QApplication>
#include <QAxObject>
#include <QDebug>

int main(int argc, char *argv[])
{
QApplication app(argc, argv);

// 创建Inventor的COM组件对象
QAxObject *inventor = new QAxObject();
inventor->setControl("Inventor.Application");

// 检查是否连接成功
if (!inventor->isNull()) {
// 获取已打开的文档数和活动文档的名称
qDebug()<<"已经连接上";
QAxObject *activeDoc = inventor->querySubObject("ActiveDocument");
if (activeDoc != NULL) { // 判断获取活动文档对象是否成功
qDebug()<<"已获取到活动文档对象";
// 获取文档名称
QString documentName = activeDoc->dynamicCall("FullFileName").toString();
qDebug()<<"文档名称:"<<documentName;
}
else
{
qDebug()<<"activeDoc获取有问题";
}
} else {
qDebug() << "Failed to connect Inventor";

}

// 清除对象
delete inventor;

return app.exec();
}

输出结果:已经连接上
activeDoc获取有问题 

设计之上!
14 条回复14
2 条消息(共 15 条)

#include <QCoreApplication>
#include <QAxObject>
#include <QDebug>
#include<windows.h>

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);

HRESULT r = OleInitialize(0);
if (r != S_OK && r != S_FALSE) {
qWarning("Failed to initialize Ole");

}

// 创建Inventor对象
QAxObject *inventor = new QAxObject("Inventor.Application");

// 显示Inventor窗口
inventor->dynamicCall("Visible",true);

// 打开指定路径的Inventor文档
QAxObject *doc = inventor->querySubObject("Documents")->querySubObject("Open(const QString&)", "D:\\xxDWJ\\xx打样\\打样-轮胎踏板\\25铝管堵头.ipt");

// 获取文档名称
QString docName = doc->dynamicCall("FullFilename").toString();

// 输出文档名称
qDebug() << "Document name: " << docName;

OleUninitialize();

返回 a.exec();
}
进程呢打开没有任何问题 说明ok,,但是如何获取 当前进程呢?

设计之上!
3 条消息(共 15 条)

亲,建议你放弃QT,换VB.NET哦


If my post answers your question, please click the "Accept as Solution" button. This helps everyone find answers more quickly!
如果我的回帖解决了您的问题,请点击 "接受为解决方案" 按钮. 这可以帮助其他人更快的找到解决方案!


王 承之
Autodesk AGN [Inventor 俱乐部] Leader
Inventor Club | Bilibili


AGN L    EESignature

4 条消息(共 15 条)
yuzeaa
回复: 858456055

先使用C++的GetActiveObject方法试试,另外用pyqt不是简单很多吗?

#include <QCoreApplication>
#include <QAxObject>
#include <QDebug>
#include <windows.h>
#include <atlbase.h>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
    if (FAILED(hr)) {
        qWarning("Failed to initialize COM.");
        return -1;
    }
    // 尝试获取当前打开的Inventor对象
    CLSID clsid;
    hr = CLSIDFromProgID(L"Inventor.Application", &clsid);

    if (SUCCEEDED(hr)) {
        IUnknown *pInventor = nullptr;
        hr = GetActiveObject(clsid, NULL, (LPVOID*)&pInventor);

        if (SUCCEEDED(hr) && pInventor) {
            qDebug() << "Found running Inventor instance.";
            QAxObject *inventor = new QAxObject(pInventor);
            pInventor->Release();
        } else {
            qDebug() << "No running Inventor instance found.";
        }
    } else {
        qDebug() << "Failed to get CLSID for Inventor.";
    }
    CoUninitialize();
    return a.exec();
}

 

5 条消息(共 15 条)
858456055
回复: yuzeaa

main.cpp:142:14: No matching function for call to 'GetActiveObject'
oleauto.h:1308:14: candidate function not viable: no known conversion from 'LPVOID *' (aka 'void **') to 'IUnknown **' for 3rd argument
设计之上!
6 条消息(共 15 条)

main.cpp:142:14:调用“GetActiveObject”没有匹配函数
oleauto.h:1308:14:候选函数不可行:第三个参数没有从“LPVOID *”(又名“void **”)到“IUnknown **”的已知转换

设计之上!
7 条消息(共 15 条)

我试过 GetActiveObject 和GetObject,一直提示没有匹配的 函数,是不是重载参数不对,识别不了
设计之上!
8 条消息(共 15 条)
yuzeaa
回复: 858456055

9 条消息(共 15 条)

谢谢这个是好资源

设计之上!
10 条消息(共 15 条)

老捡您好,您总是说笑
设计之上!
11 条消息(共 15 条)
yuzeaa
回复: 858456055

你还是自己用chatgpt一点点调试吧,我并没有QT环境无法帮你测试

微信图片_20230920135620.png

12 条消息(共 15 条)
858456055
回复: yuzeaa

好的!谢谢您!
设计之上!
13 条消息(共 15 条)

您老说笑了!
设计之上!
14 条消息(共 15 条)

您好!请问您的问题解决了吗?
如果以上专家的回答解决了您的问题,或者对您的问题有参考作用,请将他的回复点击  【接受解答】 按钮。这可以帮助其他人更快地找到解决方案,谢谢您的参与!





Lynn Zhang
Community Manager


15 条消息(共 15 条)

没有解决呢,暂时放放了,始终无法获取当前进程

设计之上!

找不到想要的内容?向社区提问或分享您的知识。

到论坛发帖  

”