在D语言中如何调用Windows中的COM控件

Windows中COM组件是Windows中重要组成部分,可以注册成系统公共组件,也可以不注册直接调用。在D语言中调用COM组件前,我们需要了解COM组件。COM组件都有一个公共的接口,使用IDL语言编写,使用mild.exe编译器编译后生成tlb格式文件,通常叫做类型库,在生成COM组件的DLL时,会把这个文件放在DLL的资源文件中,资源名称叫做TYPELIB

       要调用COM组件,先需要知道COM组件的接口,因此可以先从dll中把类型库导出成IDL接口文件,再把IDL接口文件转化为D语言的接口文件,这样就可以在D语言中使用COM控件了。

一、提取COM文件中的接口为IDL文件

把mscomm32.ocx文件拖放到VS中查看,如上图所示,可以看到TYPELIB资源,右键-->导出 文件,命名为mscomm32.tlb,文件是接口文件的编译格式,需要使用OLE/COM Object Viewer转为IDL文件。我们这儿使用d语言的一个工具tlb2idl.exe来转换,这个工具是visuald中的一个工具。转换时第三个参数需要指定IViewers.dll的路径,实际上也是使用OLE/COM Object Viewer来进行转换。

         转换成功后,成重i.dll文件,如图:

由于tlb2idl.exe程序是使用LoadTypeLib函数来加载类型库,所以需要先把类型库从DLL中导出来,如果使用LoadTypeLibFromResource函数直接从exe/dll中读取类型库,则可以直接从exe/dll中导出idl文件。使用LoadRegTypeLib函数则可以直接导出已经注册的COM控件接口。

二、把idl文件转换为D语言接口

转换idl为D语言可以使用visualD的vsi2d.exe工具完成。

       这样就生成了i.d的文件,即为mscomm32.ocx的接口文件。

三、调用COM控件

有了COM控件的接口,使用COM控件已经完成了一大半,现在只是需要来使用COM控件就可以了。调用COM控件需要以下几步:

1)使用LoadLibrary加载dll文件

2)使用GetProcAddress得到DllGetClassObject函数指针

3)通过调用DllGetClassObject函数指针获得IClassFactory工厂。

4)调用IClassFactory工厂的CreateInstance函数创建实例。

5) 把实例的指针转化为接口,之后就可以使用了。

参考:http://blog.csdn.net/wangqiulin123456/article/details/8962453

参考C++:http://blog.csdn.net/haijun286972766/article/details/6273414

参考C++:http://www.cnblogs.com/cpper-kaixuan/p/3540446.html?utm_source=tuicool&utm_medium=referral

时间: 2024-10-11 11:40:08

在D语言中如何调用Windows中的COM控件的相关文章

Java通过Ole调用Windows Media Player,部分控件属性调用方法

其实Java并不擅长做这类开发和研究,尤其是媒体影音是Java的弱项.但是为了项目,只能丧心病狂了. 起初在网络上找到了一个可行的调用类,并有一个调用实例,相信有过这方面经验都有下载过,文件名就叫WMP.但是这个还不能满足我现在做的这个项目的功能需求,里面缺少很多官方文档的空间属性方法,其中就包含我需要的. 最开始的解决方法是在网络上载找找看,希望能找到完整的类包,但是相关的资源都是大家炒来炒去,都一样,没有带来什么帮助,久寻未果就放弃了. 其后有看到c++调用Windows Media Pla

在UIWebView中间接调用网页中的javascript代码获得想要的值

日记和一些废话: 今天在使用webView加载网页后, 发现网页中的点击事件是用js代码实现的, 可是怎么点击都没有反应, 而且我主要是想获取到点击事件转到的url , 后来发现html中又这么一段代码: document.addEventListener('WebViewJavascriptBridgeReady', function onBridgeReady(event) function openPage(pageUrl) { if(bridge) { bridge.send(pageU

webview中js调用Android中的方法

package com.example.helloworld; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.view.Menu; import android.webkit.WebView; public class MainActivity extends Activity { private WebView webView = null

Windows Presentation Foundation(WPF)中的数据绑定(使用XmlDataProvider作控件绑定)

原文:Windows Presentation Foundation(WPF)中的数据绑定(使用XmlDataProvider作控件绑定) --------------------------------------------------------------------------------引用或转载时请保留以下信息:大可山?[MSN:a3news(AT)hotmail.com] http://www.zpxp.com?http://www.brawdraw.com萝卜鼠在线图形图像处理

从源码中浅析Android中如何利用attrs和styles定义控件

一直有个问题就是,Android中是如何通过布局文件,就能实现控件效果的不同呢?比如在布局文件中,我设置了一个TextView,给它设置了textColor,它就能够改变这个TextView的文本的颜色.这是如何做到的呢?我们分3个部分来看这个问题1.attrs.xml  2.styles.xml  3.看组件的源码. 1.attrs.xml: 我们知道Android的源码中有attrs.xml这个文件,这个文件实际上定义了所有的控件的属性,就是我们在布局文件中设置的各类属性 你可以找到attr

WPF中的瀑布流布局(TilePanel)控件

最近在用wpf做一个metro风格的程序,需要用到win8风格的布局容器,只能自己写一个了.效果如下 用法 : <local:TilePanel                          TileMargin="1"                         Orientation="Horizontal"                         TileCount="4" > //todo 放置内容 //loc

MVC中使用HTML Helper类扩展HTML控件

文章摘自:http://www.cnblogs.com/zhangziqiu/archive/2009/03/18/1415005.html MVC在view页面,经常需要用到很多封装好的HTML控件,这篇文章主要讲述,怎么自己扩展和定制自己需要的控件. ---------------------------------------------------------- HTML Helper类是ASP.NET MVC框架中提供的生成HTML控件代码的类. 本质上与第一种方式一样, 只是我们可以

ASP.NET中共有哪几种类型的控件?其中,HTML控件、HTML服务器控件和WEB服务器控件之间有什么区别

ASP.NET的控件包括WEB服务器控件.WEB用户控件.WEB自定义控件.HTML服务器控件和HTML控件.HTML控件.HTML服务器控件和WEB服务器控件之间的区别如下所示.q      HTML控件:这完全是浏览器端的HTML标签控件,例如HTML中常见的单选框表单控件,其HTML代码如以下代码所示.<input type="radio" id="Radio1" value="select1" checked="check

C#中父窗口和子窗口之间控件互操作实例

本文实例讲述了C#中父窗口和子窗口之间控件互操作的方法.分享给大家供大家参考.具体分析如下: 很多人都苦恼于如何在子窗体中操作主窗体上的控件,或者在主窗体中操作子窗体上的控件.相比较而言,后面稍微简单一些,只要在主窗体中创建子窗体的时候,保留所创建子窗体对象即可. 下面重点介绍前一种,目前常见的有两种方法,基本上大同小异: 第一种,在主窗体类中定义一个静态成员,来保存当前主窗体对象,例如: 代码如下: public static yourMainWindow pCurrentWin = null