“程序设计”目录存档

用VBS获取屏幕分辨率

2010年09月2日,星期四

我想到的方法有两种。

一种是WMI中的Win32_DesktopMonitor类

strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_DesktopMonitor",,48)

For Each objItem in colItems
	WScript.Echo "ScreenHeight: " & objItem.ScreenHeight
	WScript.Echo "ScreenWidth: " & objItem.ScreenWidth
Next

一种是HTML DOM中的screen对象

Dim IE
Set IE = CreateObject("InternetExplorer.Application")
IE.Navigate "about:blank"
Set screen = IE.Document.parentWindow.screen
WScript.Echo "ScreenHeight: " & screen.height
WScript.Echo "ScreenWidth: " & screen.width

参考链接
  1. Win32_DesktopMonitor Class
  2. screen Object

在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"),可以不用配置)

(更多…)

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

2010年08月26日,星期四

和实现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