回 帖 发 新 帖 刷新版面

主题:[原创]漫漫原创路 - API类型库篇

写了个API函数,常数,类型声明的类型库,目前只完成了以下几个模块:
Atom
Menu
Error Code
Error Handling
Registry
Window
Window Class

粗略数了一下,大概只声明了两百多个API吧,相关的常数和类型都已经包含在里面的了。请参看附图:
[img]http://blog.programfan.com/upfile/200704/20070409212342.jpg[/img]

由于这个类型库是我手工写的,里面的绝大多函数我都亲自去测试过了,所以使用应该没什么问题(在你的工程中引用这个类型库就可以使用的了)。

少部分(大概十多个)函数我没有测试,是因为这些我对这些函数比较陌生。例如一些MDI的函数,我对其用法不是很清楚,所以没有亲自去测试过,一般这些函数比较少用。
上面那些函数分类模块是根据MSDN2005分的,还有很多模块没有写好,我会在以后慢慢完成它,各位朋友,可以帮我测试一下里面的函数声明是否正确。有什么Bug麻烦回帖告知。

我同时提供UNICODE ANSI版本的API类型库下载。我建议你使用UNICODE版本,我个人认为使用UNICODE版本比VB那个API声明器声明的ANSI版本函数要高效很多,因为NT系统和VB内部的字符串函数都是用UNICODE实现的,如果声明为ANSI版本,就等于VB把自身的UNICODE字符串转化为ASCII字符串,再调用API,然后在API中,Windows把VB传给它的ASCII字符串转换成UNICODE字符串,再调用UNICODE的API.然后返回时又把UNICODE转换成ASCII传给VB,VB再把它转换成UNICODE,明显效率低下:
UNICODE(VB)-> ASCII(VB)-> ASCII(WINDOWS)-> UNICODE(WINDOWS)-> ASCII(WINDOWS)-> ASCII(VB)-> UNICODE(VB)

事实上,我在里面同时提供了两个版本的API,例如SetWindowTextA SetWindowTextW, 只不过我在UNICODE版本的类型库中把SetWindowText设为它的UNICODE版本:SetWindowTextW,在ANSI版本的类型库中,把SetWindowText设为它的ASCII版本:SetWindowTextA。

还有,里面的一些函数我根据常用的用法把它的原有形式改变了,如果你想调用原有形式,就调用xxxPT.PT是Proto Type(原型)的意思。

至于SetLastError的问题,我暂时使用了usesgetlasterror属性(为了测试方便),也就是说,你每调用一个API函数,VB就会自动调用GetLastError把错误代码存储在Err.LastDllError中,我个人认为这样效率太低了。事实上,调用常规声明的API函数,VB就是这样做的。我会在以后版本的类型库中把它删去。

如果使用类型库中声明的API函数,VB会自动把调用的函数入口导入EXE,而不是调用msvbvm60.dll中的DllFunctionCall来间接调用API.个人认为其中少了许多复杂的转换,效率更高。看一下图示:
用常规声明:
[img]http://blog.programfan.com/upfile/200704/20070409225225.jpg[/img]
用类型库声明:
[img]http://blog.programfan.com/upfile/200704/20070409224828.jpg[/img]
至于反汇编代码的区别,我就不帖出来了,相信大家都想得到。

好了,闲话少说,让我们看一下实例吧。下面我们就写一个实现窗体透明效果的程序,实例及源码:
[img]http://blog.programfan.com/upfile/200704/200704100803049.jpg[/img]

OK,这个程序就是那个简单,简单得我不用提供源码下载了。

UNICODE版本:[url]http://upload.programfan.com/upfile/200704092217768.rar[/url]
ANSI版本:[url]http://upload.programfan.com/upfile/200704092219365.rar[/url]


关于UNICODE和ASCII版本的一些区别图示:
ASCII:
[img]http://blog.programfan.com/upfile/200704/20070409222957.jpg[/img]
UNICODE:
[img]http://blog.programfan.com/upfile/200704/2007040922309.jpg[/img]
可以看出UNICODE版本少了很多额外的代码。

注意上图,你会发现有个__vbaSetSystemError函数调用,其实就是调用GetLastError得到Dll错误号码并存储到Err.LastDllError属性中,并且调用SetLastError(0)把错误号码清除。以后我会把usesgetlasterror属性去掉,让VB不自动产生这段代码。

OK, That's all.

回复列表 (共15个回复)

11 楼

楼顶上全是牛人,,,佩服

12 楼

楼主,请教个问题,我是个新手,今天我在编一个程序,即在一个文本框内用现常见的条码扫描枪输入条码,然后判断其是否与现存的条码相符,并检查是否有重复输入的情况,扫描枪扫描完成后会完成一个回车,那么我如何在扫描完成后不做任何操作即可对其进行间断?用什么事件?有代码不?谢谢啦~

13 楼

楼主,我发的是判断,不是间断.不好意思~~~请帮个忙,谢谢啦`~

14 楼

谢谢!!!
谢谢!!!
谢谢!!!
楼主真伟大
辛苦了
向你致敬

15 楼


太强了!佩服!

我来回复

您尚未登录,请登录后再回复。点此登录或注册