C#调用ATL COM

作者:朱金灿

来源:http://blog.csdn.net/clever101

     

             简单介绍C#程序如何调用ATL编写的COM组件。

 

首先新建一个ATL工程,具体如下:

1. 填写工程名称和路径,如下图:    

2. 选择工程的服务器类型为动态链接库,如下图:

3. 添加一个ATL简单对象,如下图:

4. 填写类名称,如下图:

5. 选择类的线程模型及其它属性,如下图:

6. 为接口类添加一个方法,如下图:

7. 填写方法名及输入输出参数,如下图:

8. 设置IDL接口属性,这里采用默认设置即可,如下图:

为刚才新建的Add方法添加代码,具体如下:

STDMETHODIMP CMathCalc::Add(LONG Num1, LONG Num2, LONG* Ret)
{
	// TODO: 在此添加实现代码
    assert(NULL!=Ret);
	*Ret = Num1+Num2;

	return S_OK;
}

     然后编译工程,生成一个dll形式的COM。

 

第二步新建一个C#控制台测试工程,具体如下:

1. 填写控制台工程名称及路径,如下图:

2. 添加一个新的库引用,如下图:

3. 选择刚才新生成的COM——MathCom 1.0类型库,如下图:

4. Program.cs中添加如下代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MathComLib; // 注意使用命名空间

namespace TestMathCom
{
    class Program
    {
        static void Main(string[] args)
        {
            int a = 2;
            int b = 3;
            int lRetVal = 0;
            MathCalc MyMathCalc = new MathCalc();
            MyMathCalc.Add(a, b,out lRetVal); // 注意这里有一个out关键字
            System.Console.Write(lRetVal.ToString());
            System.Console.WriteLine("\nPress Enter to continue.");
            System.Console.ReadLine();
        }
    }
}

 

效果图如下:

 

      

问题:

1.C#调用COM接口,在参数类型中必须是C#的int类型而不是long类型对应COM的long类型,为什么呢?

 

 

 

 

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/lanzhi/archive/2013/06/10/6470564.html

不注册dll调用atl实现的com对象 最近做一个通用的com组件调用框架,用一个注册好的factory.dll去创建另一个com.dll里面的接口,返回这个接口给脚本语言用; 结果发现如果是delphi写的dll,没有问题,如果是atl实现的dll,则会报TYPE_E_LIBNOTREGISTERED错误,让我十分郁闷,今天下决心解决,于是跟踪看了下atlcom.h里的代码,发现是GetTI这函数在作怪,代码如下所示 ITypeL 阅读详情

相关推荐

C#响应ATL事件回调示例代码

private void button1_Click(object sender, EventArgs e) { try { TGOpenApiCtrl tg = new TGOpenApiCtrl(); _ITGOpenApiCtrlEvents_TGOpenApiCallbackEventHandler cb = new _ITGOpenApiCtrlEvents_TGOpenApiCallbackEventHandler(this.EventCallback); tg.TGOpenApiCallback += cb; tg.Init("1111563433", "7738fdd1881372ae2b48018924a1febd", null, null); } catch (Exception ex) { string msg = ex.Message; } } private void EventCallback(int eventID, int errorCode, string result) { try { this.SetText("eventID:" + eventID.ToString() + "\nerrorCode:" + errorCode.ToString() + "\nResult:" + result); } catch (Exception ex) { string msg = ex.Message; } }

COM/ATL项目开发小记

最近在忙COM的项目,中途遇到一些问题和自己的一些想法,先记录下来,以便以后再遇到可以查阅,先胡乱写一通,将来东西多了,再整理成篇吧。 1.关于ATL Merge ProxyStub的问题,具体的问题就不描述了,自己新建一个ATL Merge一下就明白了。由于使用的是VS2010做开发,VC6的方式已经行不通了 (附VC6方案http://www.informit.com/library

Leo-软件开发 2217

C#调用ATL COM组件 

在上一篇“一个简单的ATL例子”的基础上,看一下如何在C#中调用这个已经生成的COM组件。首先要先吧COM组件的引用加入到C#项目中(我用的是VS2005)大概步骤如下:点击VS中的“视图”->“解决方案资源管理器”菜单项,会出现如下的窗口:在“引用”上点击右键,选择“添加引用”,找到刚才用VC++生成的COM(Simple_ATL.dll)所在的位置。选中dll,确定。在C#源代码中要加入using SIMPLE_ATLLib;using System; using System.Collections

ljg888的专栏 3170

解决VS2012在C#环境下调试ATL的问题

在创建好ATL工程供C#工程(例如WPF)调用之后,在C#项目里按F11无法进入ATL内部调试,解决方法是: C#工程右键=》属性=》调试=》勾选“启用本机代码调试”。

pigautumn的专栏 496

如何编写ATL控件

如何编写ATL控件,最后吐槽一下,微软的VS越来越不友好了,以VS2020为例,用来写ATL,复杂了不止一倍

skyksksksksks的博客 439

C 调用ATL COM

C 调用ATL COM

gdruhv的博客 398

C#调用手动编写的COM组件(非ATL向导生成,参考上一篇手把手写COM组件)

C#调用手动编写的COM组件 (非ATL向导生成,参考上一篇手把手写COM组件) 手动创建一个非ATL向导生成的COM组件,添加的接口定义文件MyIDL.idl代码如下:(修改自“COM原理与应用源代码\ch3\DictComp\"例子) import "oaidl.idl"; import "ocidl.idl"; #include typedef unsigned short

blacet的专栏 1794

基于COM组件实现C#调用C++类对象过程中的注意事项

需要注意的是,在 ATL 中,IDL(Interface Definition Language) 文件是用来定义 COM 接口的文件,使用 .idl 后缀名的 IDL 文件中可定义了 COM 接口的方法、属性和事件等信息。总的来说,ATL 通过使用多重继承和模板技术来实现 COM 组件的开发,COM 是一种二进制接口标准,它提供了一种编程模型,使得不同的应用程序和组件之间可以相互协作。本人以VS20190为例,通过打开ATL工程文件中的类视图,选中所需添加方法或属性的类,右键添加即可。

HeyLoong的博客 998

C#通过COM组件调用C++的代码(转载)

一.通过ALT建立COM组件 1、创建ATL Project 步骤1:建立一个解决方案。    步骤2:在 该解决方案中,新建一个 vc++ 的 ATL 项目。见下图 选择Dynamic-link library(DLL) 2、向工程中添加ATL对象 选择ATL Simple Object 名字为FunTest

乌托邦 3164

[转]C#调用C++类(以COM组件的形式)

如果想用C#调用C/C++写的函数,可以先将C/C++的函数写成dll文件,由C#用DllImport的方式来调用,但是这种方法无法调用C++写的类,如果想调用C++类,可以先把C++类封装成COM组件,再由C#调用。方法如下(以VS2008英文版为例说明) 一、新建一个Visual C++项目,类型为ATL Project,假设项目名为ComProject,直接点Finish即可。...

weixin_30628077的博客 140

C#调用C++类(以COM组件的形式)

如果想用C#调用C/C++写的函数,可以先将C/C++的函数写成dll文件,由C#用DllImport的方式来调用,但是这种方法无法调用C++写的类,如果想调用C++类,可以先把C++类封装成COM组件,再由C#调用。方法如下(以VS2008英文版为例说明) 一、新建一个Visual C++项目,类型为ATL Project,假设项目名为ComProject,直接点Finish即可。

Daven172的专栏 1079

JS调用ATL COM中的C++接口的做法

JS调用ATL COM中的C++接口的做法。

clever101的专栏 6037

C++ VS 2008中ATL的创建,使用。并在C++项目以及C#项目中进行调用测试

一、前言   1、本回讲解的是在  VS 2008 下的使用ATL. 并使用Win 32 ConsoleApplication进行测试以及C#项目进行测试(调用COM).     2、这第一个组件,除了所有 COM 组件必须的IUnknown 接口外,我们再实现一个自己定义的接口 IFunTest,它有一个简单的函数: Sum()完成两个数值的加法   3、ATL的介绍      ATL

rundll64的专栏 697

如何用ATL写一个C++的COM组件(C#轻松调用C/C++接口)

似乎关于COM的ALT中文教程不多 自己研究了下 现在奉献给大家 若大家有兴趣 会接着继续讲下去哦~~~

旭日的专栏 3054
上一篇: Android ViewPager真正的实现无限循环滚动
下一篇: 今天去西苑了
weixin_34326429
博客等级 码龄10年 5369粉丝 774原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值