D语言中国主页  D语言编辑器SciTE4D   DWin库 D语言官方网站
D语言编译器1.x最新版 OpenSource   Tango   webnews  Wiki

查看完整版本: D语言调用windows api入门

yidabu 2007-4-30 19:43

D语言调用windows api入门

D语言调用windows api入门知识若不分享 实在没有意义 http://www.d-programming-language-china.org 20070430点击下面网址查看原文:http://www.d-programming-language-china.orgtag:d language教程,d语言教程,d语言论坛D语言调用windows api的原理        在windows编程中,见到五花八门的数据类型,初学程序设计者会感到很头疼。        D语言论坛 http://www.d-programming-language-china.org 建议D语言初学者先花一些时间了解 Windows api数据类型,D语言的数据类型,D语言数据类型和windows api数据类型的关系:        http://bbs.d-programming-language-china.org/thread-455-1.html        在继续阅读前,建议您先阅读下面文章:        D for Win32        http://bbs.d-programming-language-china.org/thread-501-1.html        在D语言里可以直接调用Windows api,所谓直接调用是什么意思呢?我们到google搜索:        intitle:messagebox site:msdn.microsoft.com        找到 MessageBox函数的语法是:        http://msdn2.microsoft.com/en-us/library/ms645505.aspx        [Copy to clipboard] [ - ]CODE:                                int MessageBox(HWND hWnd,                    LPCTSTR lpText,                    LPCTSTR lpCaption,                    UINT uType                );                在D里就可以按照这个函数语法原型来声明这个函数和使用这个函数。        因为MessageBox这个函数已经在dmd\src\phobos\std\c\windows\windows.d里声明了,所以我们直接拿来用就是了,不用再声明。        打开windows.d文件,搜索MessageBox,找到下面两行:        [Copy to clipboard] [ - ]CODE:                                int MessageBoxA(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType);                int MessageBoxExA(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType, WORD wLanguageId);                你看,第一个函数的参数是不是我们在csdn找到的函数原型一模一样吗,唯一不同的是函数名多了一个A。        这里有个Windows api的基础知识,A结尾的api函数是8位ASCII字符集,W结尾的是16位Unicode字符集(不被Windows 98支持),如果要兼容Windows98,就用函数名A结尾函数。( 本文出处: http://www.d-programming-language-china.org )        你可能会奇怪,HWND,LPCSTR这些都不是D语言的数据类型名,在D里怎么可以直接按msdn查到的函数原型声明api函数呢        看windows.d的上部,你会发现很多alias声明。原来已经把绝大多数windows api函数用到的数字类型都声明了 D语言数据类型的别名了。比如:        [Copy to clipboard] [ - ]CODE:                                alias char CHAR;                alias CHAR *LPCSTR;                D语言编译器把.d源文件编译成目标文件(object file),其中包含了机器语言,但目标文件还不能执行,还必须被传递给链接器(Linker),由链接器生成可执行文件。        链接器读取可执行文件并检查程序中是否调用了链接库中的函数,比如 MessageBoxA这个函数在链接库user32.lib中,链接器就从user32.lib中读取了MessageBoxA函数,同目标文件一起生成可执行文件。        明白以上原理,有助于更好使用D语言调用Windows api函数。        从这里可以看出,学习D语言是要有一定编程基础的,D语言的文档,网上所能找到的D资料,绝大多数多是默认读者有编程基础的。象本文详细讲解调用api的原理与实例,可能是D语言出现以来的第一回。但D语言论坛 http://www.d-programming-language-china.org 认为,入门的教程资料越详尽越好,因为初级水平者往往是最大一个群体。D语言调用windows api实例        下面是D语言里调用windows api函数的实例,保存为test.d:        [Copy to clipboard] [ - ]CODE:                                //windows.d里声明了绝大多数Windows数据类型和本例子用到的MessageBoxA函数原型                import std.c.windows.windows;                //bbs.d-programming-language-china.org 注:main是程序默认的入口void是空返回值的意思,也就不用写return语句了                void main()                {                    MessageBoxA(null, "welcome to http://www.d-programming-language-china.org", "hello", MB_OK);                }                编译,运行,是不是成功了呢,看一下test.exe 的大小,74.5K,编译出来的程序还小了。当然比汇编是要大些,因为D语言带上了runtime的一些东西,比如自动内存管理。( 本文出处: http://www.d-programming-language-china.org )        可是,运行同时会出现一个控制台窗口怎么办        下面文章中已经讲了:        http://bbs.d-programming-language-china.org/thread-501-1.html        在.def(模块定义文件)中,至少要有下面两行内容:        http://www.digitalmars.com/ctg/ctgDefFiles.html        QUOTE:                                EXETYPE NT                SUBSYSTEM WINDOWS                否则,Win32程序运行时会打开一个控制台窗口。        立即新建一个test.def文件(源代码文件是test.d),保存到test.d同目录,里面只有两行内容。        然后编译时用命令:        QUOTE:                                dmd test.d test.def                如果你象 http://bbs.d-programming-language-china.org 一样用的是 SciTE编辑器,那么在 d.properties文件这样:( 本文出处: http://www.d-programming-language-china.org )        QUOTE:                                command.compile.*.d=$(ddir)\dmd\bin\dmd.exe -O -odobject $(FileNameExt) $(FileName).def                command.go.*.d=$(FileName)                command.go.subsystem.$(file.patterns.d)=1                注意$(ddir)是你的d目录。        然后按Ctrl+F7编译程序,按F5运行,D编译器编译非常快,写D程序是不是象脚本语言一样方便呢,要知道D语言是把源代码编译成机器码的,程序运行速度可比脚本语言快10倍呢。        把上面程序稍微修改一下:        [Copy to clipboard] [ - ]CODE:                                import std.c.windows.windows;                import std.stdio;                //bbs.d-programming-language-china.org 注:main是程序默认的入口void是空返回值的意思,也就不用写return语句了                void main()                {                    MessageBoxA(null, "welcome to http://www.d-programming-language-china.org", "hello", MB_OK);                    writefln("done");                }                导入了std.stdio以输出信息到控制台。再次编译,发现test.exe由74.5K成了109K。看来导入文件太多的话,会使程序体积大许多。        如果只是导入两个模块,而没有使用到模块里任何内容什么怎么样呢,d-programming-language-china.org测试过了,空的main函数,编译出来就是74K,74K看来是D程序的最小体积。D语言中文编程        D里可以直接中文编程,比如可以把MessageBoxA函数声明为中文别名:( 本文出处: http://www.d-programming-language-china.org )        [Copy to clipboard] [ - ]CODE:                                //windows.d里声明了绝大多数Windows数据类型和本例子用到的MessageBoxA函数原型                import std.c.windows.windows;                //bbs.d-programming-language-china.org 注:main是程序默认的入口void是空返回值的意思,也就不用写return语句了                void main()                {                    alias MessageBoxA 一大步成功社区;                    一大步成功社区(null, "welcome to http://www.d-programming-language-china.org", "hello", MB_OK);                }                在上面的例子,“一大步成功社区”成了调用函数的名字了。( lastupdate:20070430 最新文章请访问http://www.d-programming-language-china.org )关于一大步成功社区:yidabu提倡在交流中学习,在分享中提高收集感兴趣的知识,写下心得,通过网络与别人一起分享理解一点就实践一步,收获什么就分享什么,成功就是这样一点点一步步累积起来的网络只是一个工具,只有自己身心提高才是实实在在的。d-programming-language-china.org为大家提供一个学习交流各种知识的平台
页: [1]
查看完整版本: D语言调用windows api入门