Delphi Prism 中的操作系统指令
Posted
技术标签:
【中文标题】Delphi Prism 中的操作系统指令【英文标题】:Operating System Directive in Delphi Prism 【发布时间】:2011-08-23 13:01:37 【问题描述】:由于我正在编写一个最终将在从相同项目文件编译的 Windows 和 Linux 环境中运行的程序,因此我想测试一下操作系统指令的性能如何。所以,我写了一个示例代码。代码似乎意外运行,或者只是我的想象。
代码如下:
method MainForm.ControlBtn_Click(sender: System.Object; e: System.EventArgs);
begin
$IFDEF linux
MessageBox.Show('This is Linux. Horay!!!', 'mypro',MessageBoxButtons.yesno);
$ENDIF
$IFDEF WIN32
MessageBox.Show('This is Win32. Horay!!!', 'mypro',MessageBoxButtons.yesno);
$ENDIF
$IFDEF CLR
MessageBox.Show('This is .NET Framework. Horay!!!', 'mypro',MessageBoxButtons.yesno);
$ENDIF
end;
现在,当我在 Windows 上运行此方法时,它会弹出一个消息框,其中包含“这是 .NET Framework。万岁!!!'我有点期待它在 Windows 上运行。当我在 Mono 下的 Linux 上运行它时,它会弹出一个带有相同消息的消息框,“这是 .NET FrameWork。万岁!!!”我期待看到 Linux 消息,即“这是 Linux。万岁!!!”如果此代码工作正常,那么如果您确实需要执行仅受 Linux 或 Mac 或 windows 支持的不同方法,您如何检查您的程序在哪个平台上运行。
【问题讨论】:
【参考方案1】:编译器指令在编译时进行评估(因此编译器指令)。因此,生成的 .exe 将始终说明它是在哪个平台上编译的,而不是它正在运行的平台。此外,对于 Prism / Oxygene 语言,Delphi-Compiler 指令没有以这种方式定义。
检索您正在运行的操作系统的方法有点棘手(例如,有多个值表明您在 UNIX 上),但并不过分复杂。
第一个去的地方是System.Environment.OSVersion.Platform
。
此枚举在 .NET 2.0 中定义以下值:Win32S, Win32Windows, Win32NT, WinCE, Unix, Xbox, MacOSX
。 MacOS 有自己的价值,而 Linux 和其他 Unixoid 系统共享 Unix 的价值。
Mono 还定义了其他值(参见Mono FAQ entry 确定平台)。
编辑:一种可能的方法是:
var os: string := if Environment.OSVersion.Platform = System.PlatformID.Unix then
'Linux/Unix'
else if Environment.OSVersion.Platform = System.PlatformID.MacOSX then
'Mac OS X'
else
'Windows';
【讨论】:
以上是关于Delphi Prism 中的操作系统指令的主要内容,如果未能解决你的问题,请参考以下文章
Delphi -> Delphi prism,如何使用记录数组?
如何在 Delphi Prism 中调用函数 CreateProcess?