文章关键字 ‘COM’

用C语言实现IBindStatusCallback接口

2011年02月14日,星期一

昨天在Google关键字“URLDownloadToFile IBindStatusCallback”的时候,看到了看雪论坛上一个名为《在C中怎么使用IBindStatusCallback接口里的方法》的帖子。有人给出了C++的实现,有人留了一句“这样比较麻烦,但是可以实现”,却没有代码。

如果说Linux是C的天下,那么Windows就是C++的天下了。曾经有人问我,在Windows下C++比C方便得多,你为什么偏要用C?我回答,不为什么,因为我喜欢。

和COM开发有关的C语言资料真的很少,但并不是没有,Jeff Glatt的神作《COM in plain C》是最好的资料。把《COM in plain C》看完,实现IBindStatusCallback接口只是小菜一碟。

(更多…)

TLI.TLIApplication,被遗忘的COM组件

2010年12月5日,星期日

TLI.TLIApplication是一个能获取COM组件Type Library Information(类型库信息)的COM组件。曾经一直很好奇VbsEdit的代码自动补全是怎么实现的,现在看来,大约的确用的就是这个COM。

比如我想知道scrrun.dll(提供fso对象的dll)这个COM组件提供了哪些接口,可以用下面的代码:

'By Demon
'https://demon.tw
Set tli = CreateObject("TLI.TLIApplication")
Set Info = tli.TypeLibInfoFromFile("scrrun.dll")
For Each Interface In Info.Interfaces
    WScript.Echo Interface.Name 
Next

或者我忘记了fso对象有哪些属性和方法,而又没有参考文档,可以用下面的代码:

'By Demon
'https://demon.tw
Dim fso
Set fso = CreateObject("scripting.filesystemobject")
Set tli = CreateObject("TLI.TLIApplication")
Set Info = tli.ClassInfoFromObject(fso)
For Each Member In Info.DefaultInterface.Members
    WScript.Echo Member.Name 
Next

时间和篇幅有限,举的例子比较简单,更详细的请查阅文档(参考链接2为下载地址)。

参考链接:

  1. RunTime COM Object Inspection
  2. FILE: Tlbinf32.exe : Help Files for Tlbinf32.dll
  3. Visual Basic: Inspect COM Components Using the TypeLib Information Object Library

PHP调用COM组件

2010年11月25日,星期四

今天有人问PHP怎么丢出异步GET请求。我怎么感觉这个问题那么别扭,为什么要用PHP异步GET?直接用JavaScript不就行了。

我的第一个想到的是msxml2.xmlhttp,毕竟JavaScript用的就是这个。如果是Windows系统,直接调用这个COM就行了,于是查了一下PHP手册中有关COM组件的部分。

<?php
$http = new COM("msxml2.xmlhttp");
$http->open("GET","https://demon.tw",true);
$http->send();
?>

查手册的时候还无意中看到PHP可以调用.NET Framework中的类。

<?php
$stack = new DOTNET("mscorlib", "System.Collections.Stack");
$stack->Push(".Net");
$stack->Push("Hello ");
echo $stack->Pop() . $stack->Pop();
?> 

PHP果然犀利。

在C语言中嵌入执行VBS

2010年08月31日,星期二

曾经在AoGo汇编小站上看到过一个在汇编中运行VBS的函数库,觉得很神奇,但是没有给出源码,不知道他是怎么实现的。直到知道了VBS中的MSScriptControl.ScriptControl对象,VBS中的对象其实就是COM组件,但当时却不知道如何在C语言中调用COM,只好作罢。现在知道后,一切水到渠成。

用OLE View打开ScriptControl的类型库

C:\Windows\system32\msscript.ocx

得到msscript.idl,然后通过midl得到.h和.c文件

midl /no_warn /h msscript.h msscript.idl

将得到的msscript.h和msscript_i.c添加到工程中,就可以在C语言中嵌入执行VBS语句了。

用C语言调用COM组件

2010年08月30日,星期一

在这个C++大行其道的年代,想用纯C语言实现某些功能是如此的困难,相关的资料非常的难找。为此加了一个QQ群,看看有没有高手知道怎样用纯C语言调用COM组件。没想到马上被一句话顶了回来:“你为什么要这么做?用C++不就行了。”让我想到《Assembly Language Step-by-Step: Programming with Linux》中的介绍。作者是一个Turbo Pascal迷,他想知道怎样在Turbo Pascal程序中使用windows系统提供的新接口(即API),于是向一个高手请教,高手却尖锐的反问他:"Why would you want to do that?That’s what C’s for."作者最后说,当一个人问你“你为什么要这么做”的时候,他真实的意思是“你问的问题用我擅长的工具无法做到或者完全超出了我的经验范围,但是我又不想丢脸地去承认,所以……”你可以马上回答他:“因为我想知道这怎样实现。”

我当然知道用C++可以很轻松的调用COM,我只是想知道用C语言如何实现。高手发话了:“C比C++麻烦太多,而且能用C的场合都能用C++,还有必要用C吗?”不会就直接说,何必大谈C++有多么好。不可否认C++确实很强大,但是我看不惯用C++的人这种不可一世的优越感,厌屋及乌,也很反感C++。

(更多…)