用C语言调用WMI

2010年08月29日   26 views

这只是一篇翻译

你可以用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(译者注:经过我的测试,VC6.0也可以)的Win32控制台程序。为了让程序成功编译,确保在工程属性中包含wbemuuid.lib,在Configuration Properties/Linker/Input/Additional Dependencies下。(译者注:我在程序中多加了一行#pragma comment(lib,"wbemuuid.lib"),可以不用配置)

阅读这个条目剩下部分 »

在Windows下源码编译PHP

2010年08月28日   33 views

最近在学习编写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日   19 views

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

  xp.res (412 bytes, 13 hits)

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

VC编写在Windows 7下需要管理员权限的程序

2010年08月26日   26 views

和实现XP风格一样,也是通过manifest文件,下面的manifest包括了XP风格的选项

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1"
          manifestVersion="1.0">
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="X86"
            publicKeyToken="6595b64144ccf1df"
            language="*"
        />
    </dependentAssembly>
</dependency>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
        <requestedPrivileges>
            <requestedExecutionLevel
                level="requireAdministrator"
                uiAccess="false"/>
        </requestedPrivileges>
    </security>
</trustInfo>
</assembly>

保存为uac.manifest,导入到资源文件中,资源类型为24,ID为1(必须为1),重新编译即可。

参考链接:Vista UAC: The Definitive Guide

VC实现XP风格控件效果

2010年08月25日   20 views

要在VC6、VC2003、VC2005、VC2008程序中使用XP风格首先要创建一个manifest文件,将下面代码保存为xpstyle.manifest

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1"
          manifestVersion="1.0">
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="X86"
            publicKeyToken="6595b64144ccf1df"
            language="*"
        />
    </dependentAssembly>
</dependency>
</assembly>

完成以后导入到资源文件中,资源类型为24,ID为1(必须为1),重新编译即可。

参考链接:Using Windows XP Styles in your MFC/WIN32 Applications

找不到快乐

2010年08月24日   75 views

凌晨准备睡觉的时候,习惯性地看了一眼手机,竟然有一条未读信息,发件人依然熟悉而又陌生。“突然离开,还有点舍不得”,2010/08/23 22:08。曾经我舍不得离开,是因为你在这里,而你现在舍不得,是为了什么呢?回了一条信息,等了好久也不见回复,也许是你在车上睡着了吧,或者,这条信息只不过是你不小心发错了。

等着等着就睡着了,一直睡到11点半才醒。朋友的车是11点出发的,我又没有去送他。高中的时候他每次都去送我,而我现在每次都不去送他,是不是不太好。他去那么早,只不过是想早点见到佳人罢了。爸妈早就去上班了,中午不会来,家里空荡荡的。肚子一点也不饿,随便吃了点东西,打开电脑,一坐就是一个下午,却不知道自己做了什么。

VBS调用CAPICOM对象实现SHA1&MD5加密

2010年08月23日   64 views

MD5算法的VBS代码在网上可以找到很多,这些代码都是按照“算法”写出来的,所以都很长,更重要的是,找不到SHA1算法的VBS实现。本来打算自己写的,但是看到复杂的算法描述就知难而退了。算了吧,有现成的COM对象调用,又何必去关心算法呢,直接拿来使用就行了。如果下面的例子代码提示无法创建对象,需要下载CAPICOM组件并注册。

Const CAPICOM_HASH_ALGORITHM_MD2 = 1
Const CAPICOM_HASH_ALGORITHM_MD4 = 2
Const CAPICOM_HASH_ALGORITHM_MD5 = 3
Const CAPICOM_HASH_ALGORITHM_SHA1 = 0
Const CAPICOM_HASH_ALGORITHM_SHA_256 = 4
Const CAPICOM_HASH_ALGORITHM_SHA_384 = 5
Const CAPICOM_HASH_ALGORITHM_SHA_512 = 6

Dim HashedData
Set HashedData = CreateObject("CAPICOM.HashedData")
HashedData.Algorithm = CAPICOM_HASH_ALGORITHM_SHA1
HashedData.Hash "Demon"
WScript.Echo HashedData.Value

需要指出的是VBS的字符串是Unicode编码的,例如上面的字符串"Demon"在内存中的十六进制是4400 6500 6D00 6F00 6E00,这些Hash算法只关心数据的二进制值,不同编码的同一字符串的二进制值是不一样的,这就是算出来的值和PHP中(PHP默认的编码是UTF-8)的sha1("Demon")的值不一样的原因。更多CAPICOM的用法请自行查阅MSDN参考文档

下面是我写的一个用VBS校验文件SHA1和MD5值的程序,将文件拖动到VBS上即可,缺点是不能处理太大的文件。

  sha1_md5_check.vbs (752 bytes, 14 hits)

VBS中的左移位&右移位运算

2010年08月22日   21 views

之前用VBS写UTF-16编码转UTF-8编码的时候要用到移位运算,但是VBS中没有移位运算符,就用简单的乘除运算实现了移位运算函数。而移位运算并不仅仅是简单的乘除而已,这样写可能会有未知的错误。现在知道了MSScriptControl.ScriptControl对象,实现左移位、右移位是如此的简单。

Function LShift(Value, Shift)
	Set sc = CreateObject("MSScriptControl.ScriptControl")
	sc.Language = "JScript"
	LShift = sc.Eval(Value & "<<" & Shift)
End Function

Function RShift(Value, Shift)
	Set sc = CreateObject("MSScriptControl.ScriptControl")
	sc.Language = "JScript"
	RShift = sc.Eval(Value & ">>" & Shift)
End Function

在VBS中执行Javascript语句

2010年08月21日   20 views

一直想写一个VBS版的六维空间作弊程序,无奈没有找到现成的VBS版Sha1函数,也许是VBS没有位操作符的缘故吧。而JavaScript版的早已实现,然后就想能不能在VBS中执行JavaScript代码,这样就可以变相实现了,当时知道的方法是WSC文件,但是我不喜欢额外的文件,只好作罢。最近偶然发现一个MSScriptControl.ScriptControl对象,可以实现这个功能,简单的示例如下,更高级的用法自己查阅帮助文档。

Dim sc
Set sc = CreateObject("MSScriptControl.ScriptControl")
sc.Language = "JScript"
result = sc.Eval("encodeURIComponent('恶魔');")
WScript.Echo result

实践第十五天

2010年08月20日   27 views

今天是本次实践的最后一天,把昨天那个会议的也是我的最后一篇稿子写好,就开始享受这在电台的最后时光。他们实习生也是今天走,这样一来电台就一下子从热闹变得冷清了。早已看淡了别离,天下没有不散的筵席,大家都只是路人,何必装作依依不舍。我挥一挥衣袖,不带走一片云彩。