首页 / 软件开发 / VB.NET / API入门系列之四 -一个相当简单的SDK程序
API入门系列之四 -一个相当简单的SDK程序2010-01-04 cnblogs beyondcode大家好,还是我beyondcode,再次见面,前面介绍的那么多"理论知识",你们都懂了吗? 就 算还没有彻底领悟,但至少还是有那么一点意识了吧,知道有那么一回事了吧。这一篇我打算通过一个 小小小例子,来回忆一下我们以前介绍的相关知识,如Windows的数据类型,特别是和字符和字符串操作 相关的数据类型,还有就是Unicode和ASCII在API函数上的具体体现。另外,SDK编程交流群已经 建立,很多朋友踊跃参加,系列文章和群的发展离不开你们。群号:81543028。Ok,我们正式开 始,我打算从一个简单的SDK程序开始,别怕,就几行代码而已··/* BY beyondcode */
#include <windows.h>
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
MessageBoxA( NULL, "Hello beyondcode", "Title", MB_OK );
return 0;
}
程序你已经看到了 ,这恐怕就是一个最简单的带窗口的SDK程序了吧,如果你能写出代码行数比这个还少,又带窗口显示字 符串的SDK程序,欢迎交流,呵呵,开个玩笑。程序倒是简单,可是我还是要问一问,这个程序 ,你通过观察我在字符串的处理,还是在API函数的调用,还是主函数的参数写法,你能看出什么问题呢 ?.....................................对,就是我全部明确指出是单字节版本的,WinMain的第三个 参数是LPTSTR类型,调用的MessageBox是带A后缀的单字节版本,字符串常量"Hello beyondcode"和"Title"都没有使用L前缀。那么第二个问题来了, 如果我告诉你我现在 的工程环境是 使用Unicode字符集 (工程使用的字符集可以在 【项目】->工程属性 弹出的属性页中 的 【配置属性】中的【常规】左边的【字符集】中设置),那么我上面的程序能正常通过编译吗? 当然 能,因为我已经试过了,不信你也可以试试,可是为什么呢? 这是因为我指定的参数和函数需要的参数 都是单字节版本的,也就是说他们相互匹配。要是我这里将MessageBoxA改成MessageBoxW呢? 就会出错 吧,因为MessageBoxW的第二个,和第三个参数是需要LPCWSTR,通过上一篇学习,我们知道也就是const wchar_t*, 而我给出的两个字符串常量却没有用L前缀.也就是说他们是单字节的,传给宽字节版本的 MessageBoxW当然就类型不匹配了啊,所以就通不过编译了吧。通过上面的学习,我再出一个问 题,如果我此时的工程环境是使用Unicode字符集,而这里我不用MessageBoxA,也不用MessageBoxW,而 是用MessageBox,其他的都不变,结果会怎么样呢? 不能理解的可以加群讨论哟~~~好了, 单字节版本的程序,我们已经看到了,我们再来看看我们怎么才能把它改成宽字节版本的呢?其 实需要改的地方不多,也就5处WinMain改成wWinMain, WinMain的第三个参数改成LPWSTR,MessageBoxA 改成W,两个字符串常量加L就ok了。/* BY beyondcode */
#include <windows.h>
int WINAPI wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nShowCmd )
{
MessageBoxW( NULL, L"Hello Beyondcode", L"Title", MB_OK );
return 0;
}