如何根据操作系统的不同动态的定义和使用不同的API函数?(100分)

  • 主题发起人 主题发起人 coo
  • 开始时间 开始时间
C

coo

Unregistered / Unconfirmed
GUEST, unregistred user!
因为操作系统不同,能使用的API函数也有区别,有的API函数就不能在NT下
用,如何判断WIN9x还是WINNT来动态的加载不同的函数呢?
最好能用
{$ifdef xxxx}
function ...
{$endif}
这样的方式
谁能帮帮我???万分感激!!
 
我一般使用多态的方式解决这种问题

例如:

TOS= class

public
myapi(...); virtual;
end;

Tos95=class(OS)
public
myapi(...); override;
end;

TosNT= .....


var currentOS:TOS;

if (当前系统 is win95) then currentOS:=TOS95.create(...);
if (当前系统 is winNT) then currentOS:=TOSNT.create(...);

调用:currentOS.myapi(...);

不同类的myAPI中对相应API进行调用,使用起来非常方便,
因为这样myAPI的接口不必与实际API相同,可以有更多扩展。

这个方法不仅仅用于解决不同API的问题,是不同版本操作系统
的各种功能不同实现的一种解决之道。
 
API: GetVersionEx
 
举个例子吧,nt和9x下 Beep函数效果是不同的
自己写个MyBeep在9x下用(nt下又不能用),就这样:

is_nt:boolean

is_nt:=((GetVersion and $80000000)=0)

if(is_nt)then
Beep(... //在nt下
else
MyNeep(...//在9x下
 
问题是要在定义函数的时候就要知道是否是NT,在程序里检测当然没有问题,但在声
明函数的时候就要进行判断,所以我考虑可能只有用
{$ifdef xxx}
function ...
{$endif}
这样的方式才行
 
编译时指定当然是一种解决办法,由于你已经在前面提到,
我自然就不必再提了。但是你只在编译时区分,则必须在每次编译
事先define NT/95,实在麻烦。

如果两个API参数不同,且都存在于两个操作系统,则可以用overload关键字,
(这可能是你想要的)。

但是我所说的解决方法可以包含这种办法,并且可以进一步。
因为某些API只在一个操作系统中有,则不是overload可以解决的问题。
 
如果用 #if... 的话就要拿出2个exe给人了
 
最好的办法是检测 platform, 根据不同的平台来用不同的函数。
 
如果function在两个操作系统中都有自然好说,但有的函数NT下没有,所以我就要
事先判断了,然后根据操作系统的不同动态定义。
如果function中有external关键字编译时报错,怎么办?
 
附加功能 将问题提前
 
>>如果function中有external关键字编译时报错,怎么办?

用LoadLibrary + GetProcAddress

其他的还是靠我说的办法:多态/overload,二者择一
 
接受答案了.
 
后退
顶部