2010年08月 存档

在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++。

(更多…)

用C语言调用WMI

2010年08月29日,星期日

这只是一篇翻译

你可以用C语言调用WMI。虽然语法有一些不够C++友好,但是它可以工作。COM在初始设计的时候就能在C或C++中工作,COM和WMI的头文件包含对纯C语言的支持。但是程序会比较长……你的程序必须负责为所有对象分配内存,检测每个COM调用的错误,释放它初始化的对象的内存。

在使用用C++格式写的文档的时候,要在心里记着将COM调用从

pSomething->Method(arg1, ...); // C++ 

转换成

pSomething->lpVtbl->Method(pSomething, arg1, ...); // C 

下面就是我可以从WMI获取一些信息的最短的C代码片段。如果运行成功,将返回你电脑上的CPU列表和它们的时钟频率(以MHz为单位)。程序小心的释放了它分配的所有资源,但是没有做任何的错误处理(你必须在继续下一步之前检测hr的值)。

这是一个visual studio 2008(Demon注:经过我的测试,VC6.0也可以)的Win32控制台程序。为了让程序成功编译,确保在工程属性中包含wbemuuid.lib,在Configuration Properties/Linker/Input/Additional Dependencies下。(Demon注:我在程序中多加了一行#pragma comment(lib,"wbemuuid.lib"),可以不用配置)

(更多…)

在Windows下源码编译PHP

2010年08月28日,星期六

最近在学习编写PHP拓展,懒得装Linux,就研究了一下在Windows下编译PHP的方法,总算搭建好了在Windows下开发PHP拓展的环境。

1、在C盘新建一个文件夹,C:\PHPDEV

2、从官网下载最新版(我这里用的是5.2.14)的PHP源码,将下tar.gz或tar.bz2压缩包保存到C:\PHPDEV,解压到当前文件夹

3、下载php win32 build extras并保存到C:\PHPDEV,解压到当前文件夹

4、获取编译好的bison.exeflex.exe,保存到桌面或者其他C:\PHPDEV以外的地方。分别打开压缩包并进入bin文件夹,将bison.exe和flex.exe复制到C:\Windows文件夹

5、假定你已经安装了Visual Studio 2008(我个人不推荐用Visual Studio 2008,推荐使用Platform SDK Febrary 2003,官方的编译版本就是用这个PSDK编译的,但是这里用Visual Studio 2008做说明),开始菜单->Microsoft Visual Studio 2008->Visual Studio Tools->Visual Studio 2008 Command Prompt,打开Visual Studio 2008命令提示行

6、用cd命令将目录切换到C:\PHPDEV\php-5.2.14

7、输入buildconf.bat,回车。这个批处理的作用是搜索所有的.w32文件并为你创建configure.js

8、输入下面的命令

cscript /nologo configure.js –without-xml –without-wddx –without-simplexml –without-dom –without-libxml –disable-zlib — without-sqlite –disable-odbc –disable-cgi –enable-cli –enable-debug –without-iconv –disable-ipv6

为什么要disable和without那么多功能呢?因为这些功能需要的库文件并没有包含在PHP的源码包中(不然会很大),这些额外的库文件需要你自己去下载(要找全不是那么容易的)。如果你不禁用这些功能,会出现编译错误。

9、输入nmake,回车

10、第9步中可能会出现文件的编码错误,找到出现错误的文件,用EditPlus选择Western European (Windows)编码打开后另存为utf-8编码,重新nmake即可

11、编译好以后切换到C:\PHPDEV\php-5.2.6\Debug_TS,测试一下

php -r "echo ‘hello,world’;"

参考链接:

VB编程实现XP风格

2010年08月27日,星期五

这是在查VC实现XP风格的时候不小心看到的,既然看到了,就记下来,以后也许用得到。原理当然还是manifest文件,但是只是想使用的话没必要知道细节,下载下面给出的资源文件xp.res,按Ctrl+D添加到工程,编译以后的exe就具有XP风格了。

[download id=33]

参考链接:VB编程实现XP风格之终结篇