条件编译——如何判断nt?(61分)

  • 主题发起人 主题发起人 elan
  • 开始时间 开始时间
E

elan

Unregistered / Unconfirmed
GUEST, unregistred user!
我想根据
{$ifdef win16}
{$ifdef win32}这样的语句来实现nt和98下的条件编译,该如何做呢?

{$ifdef nt} ----?

祝大家 六一快乐!!!!
 
就是这样:

{$ifdef win32}
showmessage('win32');
{$else}
showmessage('not win32');//win16
{$endif}

不过要区分nt和win9x还没想到
 

>{$ifdef win32}
>showmessage('win32');
>{$else}
>showmessage('not win32');//win16
>{$endif}

对啊,我也知道,但是对nt呢?


 
GetVersion
GetVersionEx.
 
type struct{
DWORD dwOSVersionInfoSize
//版本信息结构大小
DWORD dwMajorVersion
//主版本号win98,nt4.0都为 4
DWORD dwMinorVersion
//次版本号win98-10,nt4.0-0
DWORD dwBuildNumber
//构件数
DWORD dwPlatformId
//平台标识
// VER_PLATFORM_WIN32S Windows3.1
// VER_PLATFORM_WIN32_WINDOWS Windows95
// VER_PLATFORM_WIN32_NT Windows NT
TCHAR szCSDVersion[128];
}OSVERSIONINFO;

procedure TForm1.Button1Click(Sender: TObject);
var
pOSVI: OSVERSIONINFO;
begin
// 设置版本信息结构的大小
pOSVI.dwOSVersionInfoSize:=sizeof(OSVERSIONINFO);
// 获取版本信息
GetVersionEx( pOSVI );
// 显示信息
Edit1.Text:=IntToStr(pOSVI.dwMajorVersion)+'.'
+IntToStr(pOSVI.dwMinorVersion)+'.'
+IntToStr(pOSVI.dwBuildNumber)+'.'
+IntToStr(pOSVI.dwPlatformId)+'.'
+pOSVI.szCSDVersion;
end;
 
我在澄清一下,我是想实现象pipi所说的真正意义上的条件编译
{$ifdef win32}
showmessage('win32');
{$else}
showmessage('not win32');//win16
{$endif}



 
你不会想在nt 下编译nt程序,?9x下编译9x程序吧?
否则,你自己定义变量编译2种文件不更好?还省的换系统编译另外一个
 
我试了:

var p: TOsVersionInfo;
begin
p.dwOSVersionInfoSize := SizeOf(TOsVersionInfo);
GetVersionEx(p);
if p.dwPlatformId = VER_PLATFORM_WIN32_NT then
begin
{$DEFINE ISNT}
end;
{$IFDEF ISNT}
ShowMessage('This is NT');
{$ELSE}
ShowMessage('This is not NT');
{$ENDIF}
end;
呵呵,给分。
 
还是先搞明白什么叫条件编译吧。

你可以用
{$ifdef win16}
{$ifdef win32}

可是你的程序里什么时候定义过 win32?是Delphi的不同版本替你定义"死"了的。
因为delphi5拿到win16上就执行不了,而到了delphi1上,自然就是定义了win16。

如果想区分98/NT,就在自己的程序前面写
{$Define NT}或{$Define 98}
后面需要条件编译时,{$IFDEF NT}/{$IFDEF 98}
然后想编译哪个平台下运行,就把另一个{$Define ...}注释掉,
反之亦然,这就叫条件编译。

to SuperMMX: 你那个程序当然通过了,但是你把他改一下:

if p.dwPlatformId = 54321 then ...

照样出来'This is NT',因为你那句{$DEFINE ISNT}
根本是编译指令,有了它,Delphi编译的永远是那句
ShowMessage('This is NT');怎么会受到运行时if...then的影响呢?

你们怎么总是想把运行时的事情拿到编译时来做?
 
多人接受答案了。
 
这样做当然是有意义的,
你的程序要在不同的 platform 上运行, 如 98 nt 等,
而要程序不变,只能用这种方法。

btw: 我的代码只是例子,知道怎么用就行乐。
 
to SuperMMX:

别怪我多嘴,我的意思就是你的例子没意义,是错的!
{$define}哪一行代码根本就不是你所想象的那样
是由于p.dwPlatformId = VER_PLATFORM_WIN32_NT才起作用的。
它一直在起作用,不信你把你的这段代码放到win98上去编译,
照样会显示出来'This is NT'。
 

Similar threads

回复
0
查看
804
不得闲
I
回复
0
查看
822
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部