第五章:Windows
前言
本章描述的是32位的Windows系统下的D实现。当然,D在Windows下所特有的功能通常是不能被移植到其它平台的。
在D语言中不用C语言中的:
# include <win.s>
而是直接用;
import std.c.windows.windows;
一、调用协定
在C中,WindowsAPI的调用协定是__stdcall。在D中,仅需要使用:
extern (Windows)
{
/*...函数声明...*/
}
Windows连接属性(linkage)设置了调用协定和名字碎解(namemangling)文法,以保持跟Windows系统的兼容性。
对于C中可能是__declspec(dllimport)或__declspec(dllexport)的函数,则需要使用属性export:
export void func (intfoo);
二、win可执行文件
WindowsGUI程序也可以使用D来编写。在\dmd2\samples\d\winsamp.d里,可以找
到一个示例。
下面这些是必不可少的:
1.不使用main函数作为程序入口点,而是换成使用WinMain函数。
2.WinMain必须使用下列形式:
import core.runtime;
import std.c.windows.windows;
extern (Windows)
int WinMain (HINSTANCEhInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
int result;
void exceptionHandler(Exception e)
{
throw e;
}
try
{
Runtime.initialize(&exceptionHandler);
result = myWinMain(hInstance,hPrevInstance,lpCmdLine,nCmdShow);
Runtime.terminate(&exceptionHandler);
}
catch(Objecto)//捕捉任何未捕捉过的异常
{
MessageBoxA(null,cast(char*)o.toString(),"Error",
MB_OK|MB_ICONEXCLAMATION);
result = 0;//失败
}
returnresult;
}
intmyWinMain(HINSTANCEhInstance,
HINSTANCEhPrevInstance,
LPSTRlpCmdLine,
intnCmdShow)
{
/*...在这里插入用户代码...*/
}
函数myWinMain()用于放置用户代码,WinMain函数的其余部分是初始化和关闭D运行系统的样板文件。
3..def(模块定义文件-ModuleDefinitionFile)文件至少包含下面两行:
EXETYPE NT
SUBSYSTEM WINDOWS
如果没有这些内容,每次应用程序运行时,Win32都会打开一个文本控制台窗口。
4.编译器在识别到WinMain()的存在后,便发出对__acrtused_dll和运行库phobos.lib的引用。