文章关键字 ‘C’

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

(更多…)

用EditPlus+BCC5.5搭建C语言学习环境

2010年07月16日,星期五

刚开始学习C语言的时候,被谭浩强忽悠了,用Turbo C来编译器,虽然Turbo C是Borland的成名之作,但是现在看来已经属于古董级别的了,而Borland的传奇也已不再延续。后来用的是Visual C++ 6.0 ,学校的网费是按流量计算的,当时也还没有各种BT站的账号,开着计费客户端从外网下载的,差不多500M,心痛了好久。只是学习C语言的话用VC显然太浪费了,虽然也有针对C语言学习的所谓精简版VC,大概也就几M吧,但是总感觉怪怪的,有一种司马迁的感觉。再后来,发现Borland有一款免费的C++编译器C++ Compiler,结合很小很强大的EditPlus,学习C语言已经绰绰有余了,心情好的话还可以写写windows程序。如果觉得配置麻烦你还是老老实实用TC或者VC吧。

(更多…)

用C语言屏蔽键盘和鼠标

2010年06月22日,星期二

调用windows API中的SetWindowsHookEx函数释放键盘和鼠标钩子就可以实现,没有什么技术含量。只不过看到Google关键词“C语言 屏蔽键盘”没有好的链接,所以才写出来。当然,Ctrl+Alt+Del这个组合键是无法通过钩子函数屏蔽的,目前我还没有找到屏蔽的方法,如果你知道,请留言告诉我,谢谢。

很久很久以前我觉得让别人的鼠标不能动是很神奇的事情,这也算是学编程的一个动机罢。初学C语言的时候发现学完只能拿来算数学题,很没有成就感。后来才发现,其实并没有想象中的那么难。借用别人说的一句话,C语言是一种需要很长时间锻炼才知道它很无敌的语言。本文不打算详细介绍钩子函数,只给出了我写的示例代码,感兴趣的可以看看,写的不怎么好,高手请自觉路过。钩子函数的详细用法请自己参阅MSDN文档

代码下载地址,如果你觉得程序有效,请留言告诉我:

[download id=15]

VBS和C语言效率比较

2010年06月19日,星期六

上一篇文章讲到用VBS写二进制文件,为了写二进制文件,首先我们要得到一个文件的二进制值的数组。可以通过程序获取文件的二进制值,本来我是用VBS实现的,但是发现VBS效率实在太低,只好改用C语言。一直知道VBS的效率是很低的,但是不知道和C语言比差多少,于是就有了这篇文章。两个程序都是读取文件的二进制值并转换成十进制后写入一个txt文件,并输出程序运行的时间。

VBS程序代码

Option Explicit
Dim begin_time,end_time,elapse_time
Dim str,length,i,c
Dim ado,fso,file
begin_time = Timer
Set ado = CreateObject("adodb.stream")
Set fso = CreateObject("scripting.filesystemobject")
Set file = fso.OpenTextFile("foo.txt",2,True)
ado.Type = 1
ado.Open
ado.LoadFromFile("foo.jpg")
str = ado.Read
length = LenB(str)
For i = 1 To length
	c = AscB(MidB(str,i,1))
	file.WriteLine c & "," & "_"
Next
ado.Close
end_time = Timer
elapse_time = end_time - begin_time
WScript.Echo elapse_time

C语言程序代码

#include <stdio.h>
#include <time.h>
int main(void)
{
	clock_t end,begin=clock();
	int c;
	FILE *in,*out;	

	in = fopen("foo.jpg","rb");
	out = fopen("bar.txt","wb");
	while((c=fgetc(in))!=EOF)
		fprintf(out,"%d\r\n,_",c);
	end = clock();
	printf("%f\n",(float)(end-begin)/1000);
	return 0;
}

同是用一个100kb大小的foo.jpg文件作测试,VBS程序平均运行了7.5秒左右,而C语言程序只运行了0.04秒左右,效率的差别可以看出。如果文件的大小增大,效率的差别更加的明显。