主题:[原创]漫漫原创路 - 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.
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.