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

来源:互联网 发布:看股票行情的软件 编辑:程序博客网 时间:2024/05/18 02:00

参考:

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;
}


0 0
原创粉丝点击