yidabu 2007-5-2 09:29
D语言调用标准库未声明的windows api
D语言调用标准库未声明的windows api知识若不分享 实在没有意义 http://www.d-programming-language-china.org 20070502点击下面网址查看原文:http://www.d-programming-language-china.orgtag:D语言标准库,d语言 windows,d语言入门 在std.c.windows.windows里声明了Windows api数据类型,和常见的windows api函数,如果要用到windows.d里没有声明的api函数怎么办 在上一个教程里,D语言论坛 http://www.d-programming-language-china.org 详细讲解了在D语言里直接调用windows api的方法,见下面文章: http://bbs.d-programming-language-china.org/thread-551-1.html 我们打开windows.d,看看里面怎么做的,照抄就是了。 在阅读本文前,建议先看一下 D语言 atrributes: http://bbs.d-programming-language-china.org/thread-472-1.html QUOTE: D 提供了一种方便的调用 C 函数和操作系统 API 函数的方法,因为对这两者的兼容都是必要的。链接类型 是大小写敏感的,并且可以由实现扩展(它们不是关键字)。C 和 D 是必须提供的,其他的含义由实现定义。C++保留将来使用。实现注记:对于 Win32 平台来说,应该支持 Windows 和 Pascal 。 Windows API 调用约定是: [Copy to clipboard] [ - ]CODE: extern (Windows): void *VirtualAlloc( void *lpAddress, uint dwSize, uint flAllocationType, uint flProtect ); 以WinExec函数为例 1 在windows.d里查找WinExec,未找到 2 在msdn.microsoft.com搜索WinExec http://msdn2.microsoft.com/en-us/library/ms687393.aspx:( 本文出处: http://www.d-programming-language-china.org ) 找到WinExec函数的语法原型是: [Copy to clipboard] [ - ]CODE: UINT WinExec(LPCSTR lpCmdLine,UINT uCmdShow); 3 理解函数参数的意思 Windows api的数据类型见下面: http://msdn2.microsoft.com/en-us/library/aa383751.aspx LPCSTR: 指向一个以"NULL"结束的8bit WINDOWS字符串常量的指针 QUOTE: Pointer to a constant null-terminated string of 8-bit Windows (ANSI) characters,typedef __nullterminated CONST CHAR *LPCSTR; 也就是LP是指针的意思,C是constant常量的意思,STR是字符串。( 本文出处: http://www.d-programming-language-china.org ) UINT: 32位无符号整数( 本文出处: http://www.d-programming-language-china.org ) QUOTE: Unsigned INT. This type is declared in WinDef.h as follows:typedef unsigned int UINT; INT:32-bit signed integer. This type is declared in WinDef.h as follows:typedef int INT; 也就是U是Unsigned的意思。 一定要理解windows api数据类型的含义和对应的D语言数据类型。 可以参考下表: http://bbs.d-programming-language-china.org/thread-455-1.html 在D语言里,8位的无符号utf-8字符是char类型。32位无符号整数是uint类型。 再来看看windows.d是怎么定义的。 打开windows.d,查找LPCSTR,结果找到: QUOTE: alias CHAR *LPCSTR; CHAR还不是D语言的数据类型,再往上找:( 本文出处: http://www.d-programming-language-china.org ) QUOTE: alias char CHAR; 也就是*LPCSTR是char的别名,和我们预料的一致。 同样可以在windows.d里找到: QUOTE: alias uint UINT; 明白以上原理,我们就可以完全可以自己写出windows.d来了 4 D语言调用Windows api函数WinExec代码 下面就是全部代码: [Copy to clipboard] [ - ]CODE: import std.c.windows.windows; //for WinExec import std.windows.charset; //for toMBSz void main() { // http://bbs.d-programming-language-china.org 注toMBSz函数是为了生成null结尾字符串 LPCSTR lpCmdLine = toMBSz(r"C:\Program Files\Internet Explorer\iexplore.exe http://www.d-programming-language-china.org"); UINT uCmdShow = SW_SHOWMAXIMIZED; WinExec(lpCmdLine,uCmdShow); } // http://bbs.d-programming-language-china.org 下面就是定义要调用的windows api函数 extern (Windows) { export { UINT WinExec(LPCSTR lpCmdLine,UINT uCmdShow); } } ( lastupdate:20070502 最新文章请访问http://www.d-programming-language-china.org )关于一大步成功社区:yidabu提倡在交流中学习,在分享中提高收集感兴趣的知识,写下心得,通过网络与别人一起分享理解一点就实践一步,收获什么就分享什么,成功就是这样一点点一步步累积起来的网络只是一个工具,只有自己身心提高才是实实在在的。d-programming-language-china.org为大家提供一个学习交流各种知识的平台