We neither need to write multiple implementatiins of the same thing, nor
do we need to use magic python stuff. There is feature built into C and
C++, that allows to do this in a pretty neat way: It's called "global
variable". ;-)
Additionally Windows has the PEB, which already contains the Version number.
DllMain()
{
g_VersionNumber = Peb->OSMajorVersion << 24 | Peb->OSMinorVersion
<< 16 | Peb->OSBuildNumber;
}
SetTimer()
{
if (g_VersionNumber >= NTDDI_WINXPSP2) foo() else bar();
}
Am 09.03.2015 um 11:46 schrieb Magnus Johnsson:
A thought occurs to me. Is there a way to add
descriptors to DLL
functions? It would be a neat way to handle having multiple versions.
In Python you can tag functions like @TargetVersionWindowsXP. If you
could transparently hide and rename symbols in the DLL's kernel-side
on load time, then you could have all the functions in the same file
without losing sanity points.
2015-03-09 11:27 GMT+01:00 Colin Finck <colin(a)reactos.org
<mailto:colin@reactos.org>>:
Am 09.03.2015 um 09:59 schrieb Aleksey Bragin:
I suppose if the API "changes" (and it
means, it improves, and usually
without breaking backward compatibility), then there is no reason to
provide old, broken or incomplete implementation. I doubt there
is any
popular app which relies on some bugs in old API
implementation
which
can justify that.
My favourite for subtle changes inside Win32: SetTimer :)
MSDN has removed many of the details now, so I quote from the old
version of the page:
===================================================================
uElapse
[in] Specifies the time-out value, in milliseconds.
Windows NT/2000/XP: If uElapse is greater than USER_TIMER_MAXIMUM, the
timeout is set to 1.
Windows 2000/XP: If uElapse is less than USER_TIMER_MINIMUM, the
timeout
is set to USER_TIMER_MINIMUM.
Windows Server 2003: If uElapse is greater than
USER_TIMER_MAXIMUM, the
timeout is set to USER_TIMER_MAXIMUM.
Windows XP SP2/Windows Server 2003 SP1: If uElapse is less than
USER_TIMER_MINIMUM, the timeout is set to USER_TIMER_MINIMUM. If
uElapse
is greater than USER_TIMER_MAXIMUM, the timeout is set to
USER_TIMER_MAXIMUM.
===================================================================
Reference e.g.
http://www.jliforum.de/board/viewtopic.php?p=61375#61375
This has broken at least our third-party imported Matrix screensaver
(see fix in r28955). Due to the widespread usage of the SetTimer API,
there are probably more examples.
Of course, given that we're targetting Windows Server 2003 SP1 or
newer,
the behaviour for us is clear. But if such changes occur in recent
Windows versions as well, I believe we need different
implementations of
an API for each Windows version we try to emulate.
Maybe someone can give an example of such a change in more recent
Windows versions as well.
Cheers,
Colin
_______________________________________________
Ros-dev mailing list
Ros-dev(a)reactos.org <mailto:Ros-dev@reactos.org>
http://www.reactos.org/mailman/listinfo/ros-dev
_______________________________________________
Ros-dev mailing list
Ros-dev(a)reactos.org
http://www.reactos.org/mailman/listinfo/ros-dev