您的位置:首页 > 编程语言 > Qt开发

C#创建COM组件,QT调用COM组件简单测试(VS2008+QT4.6.4)

2016-11-27 18:28 876 查看
参考:
http://wenku.baidu.com/link?url=76Qh59hRfMmwoplATvtfWUXRztZKOPk7n2-Rlnx4-4SrDppzR9_gkHbnQsuqnIJwvhp1keaAqgFzjePq1zrZnHgxUzsVRyWPtznHgGDSLU3 http://www.cnblogs.com/panlijiao/archive/2012/10/14/2773881.html
一. C#创建组件:

1. VS2008新建一个项目,选择Visual C#, Class library

修改Properties下面的AssemblyInfo.cs文件,ComVisible属性设置为True,即:[assembly: ComVisible(true)]

2. 右击项目,选择“属性”,

选择“生成”选项卡,把“为COM互操作注册”勾选上

选择“签名”选项卡,把“为程序集签名”勾选上,在下面下拉选项中选择“<新建...>”,弹出对话框中的“密钥文件名称”栏填写名称(随便填写,后面会出现在VS资源管理器的工程下面*.snk),把“使用密码保护密钥文件”取消选择。

3. 开始编码,简单代码和重要注释

using System;

using System.Collections.Generic;

using System.Runtime.InteropServices;//必须加上此项

using System.Linq;

using System.Text;

using System.IO.Ports;

namespace CSharpClassLib

{

[ComVisible(true)]

[Guid("9ABB648D-71A9-41d7-89C1-8D35328564F1")]

// GUID:用VS2008的命令提示符中输入:guidgen 就会出来它的窗口,

//在几个复选框选择最后一个Registry Format,点击New Guid,然后COPY就

//行了(以下如有guid的字符串,全部同样操作)

//注意在[Guid("....... 这个里面要去掉GUID前后的花括号

public interface MyCom_Interface

{

void Initialize();

void Dispose();

int add(int a, int b);

}

[ComVisible(true)]

[Guid("DB7FB367-7217-4ff1-9805-673DAE4D19C9")]

[ProgId("CSharpClassLib.Class1")]

public class Class1:MyCom_Interface

{

public void Initialize() { }

public void Dispose() { }

public Class1() { }

public int add(int a, int b)

{

return a + b;

}

}

}

4. 编译生成.dll文件,还会有.tlb文件

5. 注册COM,在vs20080命令提示符下面,进入刚生成的dll所在的目录,

执行gacutil /i CSharpClassLib.dll

执行regasm CSharpClassLib.dll

以上都需要显示成功,如有错误,请检查。注意打开VS2008命令提示符需要用管理员身份。注册成功后可以在注册表(运行regedit)中查看(位置:HKEY_CLASSES_ROOT),可以直接搜索“CSharpClassLib”。注册表中找到这个COM,可以看到GUID

二,在QT 工程中使用这个COM

VS2008中需要添加链接库,在项目属性中的Linker->input 中添加QT必要的库,这里要加

QtCored4.lib

QtGuid4.lib

QAxContainer.lib

QAxContainerd.lib

QAxServer.lib

QAxServerd.lib

贴上源码:

#include "CommonHeader.h"

#include <QtCore/QtCore>

#include <QtGui/QtGui>

#include <ActiveQt/QAxObject>

int main(int argc, char* argv[])

{

QApplication app(argc, argv);

QAxObject object("DB7FB367-7217-4ff1-9805-673DAE4D19C9");

QVariantList params0;

params0 << QVariant(21);

params0 << QVariant(3);

int a = object.dynamicCall("add(int,int)",params0).toInt();

QLabel *label = new QLabel("Hello Qt!");

label->show();

return app.exec();

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: