windows temp directory

RayMcManus

New Member
Hi,

I need to tell a program that I'm working on to save a file to the current user's windows:\temp directory. I remember hearing of code that lets tells Progress which version of Windows is being run (so it knows what directory to save to), and was wondering how to do so.
 

Chris Kelleher

Administrator
Staff member
This from Jurjen's www.global-shared.com website should help you out:

<h1>GetVersionExA</h1>
<h3>Which version of windows is running</h3>
<p>
The API is not exactly the same for the different Windows
versions so it is sometimes usefull to know which Windows version
is running. However the differences may disappear when Windows 95/98
and Windows NT mature (or when add-ons are installed) so checking
for the Windows version may become less interesting: you should
prefer to check for <b>features</b> instead versions.
<p>
This procedure here shows what Windows version you are running providing it's a 32-bit version. These are:
<li> Windows 3.1 with win32s
<li> Windows 95
<li> Windows 95 OSR 2
<li> Windows 98
<li> NT 3.51
<li> NT 4.0
<li> Windows 2000
<br>
Windows CE also runs a subset of WIN32 but CE isn't interesting for us.
<p>
The procedure also shows buildnumber and CSDversion. What a CSDversion is, is not always clear:
on NT it's a string describing the latest installed Service
Pack. On 95 it can be anything but CSDversion will be "a" if Service Pack
1 is installed.
<p>

<TABLE BORDER WIDTH=100% BGCOLOR=white class="voorbeeld"><tr><td>
<pre>
<span class="src-prep">{windows.i}</span src-prep>

<span class="src-keyword">DEF VAR</span src-keyword> lpVersionInfo <span class="src-keyword">AS MEMPTR</span src-keyword>.
<span class="src-keyword">DEF VAR</span src-keyword> dwPlatformID <span class="src-keyword">AS INTEGER NO-UNDO</span src-keyword>.
<span class="src-keyword">DEF VAR</span src-keyword> chPlatformID <span class="src-keyword">AS CHAR NO-UNDO</span src-keyword>.
<span class="src-keyword">DEF VAR</span src-keyword> BuildNumber <span class="src-keyword">AS INTEGER NO-UNDO</span src-keyword>.
<span class="src-keyword">DEF VAR</span src-keyword> MajorVersion <span class="src-keyword">AS INTEGER NO-UNDO</span src-keyword>.
<span class="src-keyword">DEF VAR</span src-keyword> MinorVersion <span class="src-keyword">AS INTEGER NO-UNDO</span src-keyword>.
<span class="src-keyword">DEF VAR</span src-keyword> ReturnValue <span class="src-keyword">AS INTEGER NO-UNDO</span src-keyword>.

<span class="src-keyword">SET-SIZE</span src-keyword>(lpVersionInfo) = <span class="src-number">148</span src-number>.
<span class="src-keyword">PUT-LONG</span src-keyword>(lpVersionInfo,<span class="src-number">1</span src-number>) = <span class="src-number">148</span src-number>.
<span class="src-keyword">RUN</span src-keyword> GetVersionExA <span class="src-keyword">IN</span src-keyword> hpApi( <span class="src-keyword">GET-POINTER-VALUE</span src-keyword>(lpVersionInfo),
<span class="src-keyword">OUTPUT</span src-keyword> ReturnValue).
dwPlatformID = <span class="src-keyword">GET-LONG</span src-keyword>(lpVersionInfo,<span class="src-number">17</span src-number>).

<span class="src-keyword">CASE</span src-keyword> dwPlatformID :
<span class="src-keyword">WHEN</span src-keyword> <span class="src-number">0</span src-number> <span class="src-keyword">THEN</span src-keyword> chPlatformID = <span class="src-char">"Win32s on Windows 3.1"</span src-char>.
<span class="src-keyword">WHEN</span src-keyword> <span class="src-number">1</span src-number> <span class="src-keyword">THEN</span src-keyword> chPlatformID = <span class="src-char">"Win32 on Windows 95 or 98"</span src-char>.
<span class="src-keyword">WHEN</span src-keyword> <span class="src-number">2</span src-number> <span class="src-keyword">THEN</span src-keyword> chPlatformID = <span class="src-char">"Win32 on Windows NT"</span src-char>.
<span class="src-keyword">END</span src-keyword>.

<span class="src-keyword">CASE</span src-keyword> dwPlatformID :
<span class="src-keyword">WHEN</span src-keyword> <span class="src-number">1</span src-number> <span class="src-keyword">THEN</span src-keyword> BuildNumber = <span class="src-keyword">GET-SHORT</span src-keyword>(lpVersionInfo,<span class="src-number">13</span src-number>).
<span class="src-keyword">WHEN</span src-keyword> <span class="src-number">2</span src-number> <span class="src-keyword">THEN</span src-keyword> BuildNumber = <span class="src-keyword">GET-LONG</span src-keyword> (lpVersionInfo,<span class="src-number">13</span src-number>).
<span class="src-comment">/* what about 'when 0' for 3.1 with win32s ?? */</span src-comment>
<span class="src-keyword">END</span src-keyword>.

<span class="src-comment">/* You have Windows 95 OSR 2 if:
dwPlatformID=1
and
LOWORD(BuildNumber)=1111 (probably hex??)
Unfortunately I have not had a chance to test that.
*/</span src-comment>

<span class="src-keyword">CASE</span src-keyword> dwPlatformID :
<span class="src-keyword">WHEN</span src-keyword> <span class="src-number">1</span src-number> <span class="src-keyword">THEN DO</span src-keyword>:
MinorVersion = <span class="src-keyword">GET-BYTE</span src-keyword>(lpVersionInfo,<span class="src-number">15</span src-number>).
MajorVersion = <span class="src-keyword">GET-BYTE</span src-keyword>(lpVersionInfo,<span class="src-number">16</span src-number>).
<span class="src-keyword">END</span src-keyword>.
<span class="src-keyword">OTHERWISE DO</span src-keyword>:
MajorVersion = <span class="src-keyword">GET-LONG</span src-keyword>(lpVersionInfo, <span class="src-number">5</span src-number>).
MinorVersion = <span class="src-keyword">GET-LONG</span src-keyword>(lpVersionInfo, <span class="src-number">9</span src-number>).
<span class="src-keyword">END</span src-keyword>.
<span class="src-keyword">END</span src-keyword>.

<span class="src-keyword">MESSAGE</span src-keyword> <span class="src-char">"MajorVersion="</span src-char> MajorVersion <span class="src-keyword">SKIP</span src-keyword>
<span class="src-char">"MinorVersion="</span src-char> MinorVersion <span class="src-keyword">SKIP</span src-keyword>
<span class="src-char">"BuildNumber="</span src-char> BuildNumber <span class="src-keyword">SKIP</span src-keyword>
<span class="src-char">"PlatformID="</span src-char> chPlatFormId <span class="src-keyword">SKIP</span src-keyword>
<span class="src-char">"CSDversion="</span src-char> <span class="src-keyword">GET-STRING</span src-keyword>(lpVersionInfo,<span class="src-number">21</span src-number>) <span class="src-keyword">SKIP</span src-keyword>(<span class="src-number">2</span src-number>)
<span class="src-char">"on NT, CSDversion contains version of latest Service Pack"</span src-char> <span class="src-keyword">SKIP</span src-keyword>
<span class="src-char">"on 95/98, CSDversion contains arbitrary extra info, if any"</span src-char>
<span class="src-keyword">VIEW-AS ALERT-BOX</span src-keyword>.

<span class="src-keyword">SET-SIZE</span src-keyword>(lpVersionInfo) = <span class="src-number">0</span src-number>.
</pre>
</td></tr></TABLE>
<p>
<h3>NT4 Terminal Server Edition</h3>
To check if you are running on Terminal Server Edition you can use function <NOBR>ValidateProductSuite("Terminal Server").</NOBR><br>
Old documentation suggested that this function would be added to the WIN32 API in Windows 2000.
But newer documentation for Windows 2000 describes a new function VerifyVersionInfo - to be called with
wSuiteMask = VER_SUITE_TERMINAL. We will see.
<p>
In the meantime you can write your own
function ValidateProductSuite in Progress 4GL and some registry functions. An example is on page
<a href="oneinst.html">Disallowing multiple instances of your application</a>.


<p>
<h3>A couple of convenient functions</h3>
<TABLE BORDER WIDTH=100% BGCOLOR=white class="voorbeeld"><tr><td>
<pre>
<span class="src-keyword">FUNCTION</span src-keyword> RunningWindows95 <span class="src-keyword">RETURNS LOGICAL</span src-keyword> () :
<span class="src-comment">/* returns TRUE if you are running Windows 95 */</span src-comment>

<span class="src-keyword">DEF VAR</span src-keyword> Win95 <span class="src-keyword">AS LOGICAL NO-UNDO</span src-keyword>.
<span class="src-keyword">DEF VAR</span src-keyword> lpVersionInfo <span class="src-keyword">AS MEMPTR</span src-keyword>.
<span class="src-keyword">DEF VAR</span src-keyword> dwPlatformID <span class="src-keyword">AS INTEGER NO-UNDO</span src-keyword>.
<span class="src-keyword">DEF VAR</span src-keyword> MinorVersion <span class="src-keyword">AS INTEGER NO-UNDO</span src-keyword>.
<span class="src-keyword">DEF VAR</span src-keyword> ReturnValue <span class="src-keyword">AS INTEGER NO-UNDO</span src-keyword>.

<span class="src-keyword">SET-SIZE</span src-keyword>(lpVersionInfo) = <span class="src-number">148</span src-number>.
<span class="src-keyword">PUT-LONG</span src-keyword>(lpVersionInfo,<span class="src-number">1</span src-number>) = <span class="src-number">148</span src-number>.
<span class="src-keyword">RUN</span src-keyword> GetVersionExA <span class="src-keyword">IN</span src-keyword> hpApi( <span class="src-keyword">GET-POINTER-VALUE</span src-keyword>(lpVersionInfo),
<span class="src-keyword">OUTPUT</span src-keyword> ReturnValue).
dwPlatformID = <span class="src-keyword">GET-LONG</span src-keyword>(lpVersionInfo,<span class="src-number">17</span src-number>).
MinorVersion = <span class="src-keyword">GET-BYTE</span src-keyword>(lpVersionInfo,<span class="src-number">15</span src-number>).

Win95 = (dwPlatformId=<span class="src-number">1</span src-number> <span class="src-keyword">AND</span src-keyword> MinorVersion=<span class="src-number">0</span src-number>).

<span class="src-keyword">SET-SIZE</span src-keyword>(lpVersionInfo) = <span class="src-number">0</span src-number>.
<span class="src-keyword">RETURN</span src-keyword> Win95.

<span class="src-keyword">END FUNCTION</span src-keyword>.

<span class="src-keyword">FUNCTION</span src-keyword> RunningWindows98 <span class="src-keyword">RETURNS LOGICAL</span src-keyword> () :
<span class="src-comment">/* returns TRUE if you are running Windows 98 */</span src-comment>

<span class="src-keyword">DEF VAR</span src-keyword> Win98 <span class="src-keyword">AS LOGICAL NO-UNDO</span src-keyword>.
<span class="src-keyword">DEF VAR</span src-keyword> lpVersionInfo <span class="src-keyword">AS MEMPTR</span src-keyword>.
<span class="src-keyword">DEF VAR</span src-keyword> dwPlatformID <span class="src-keyword">AS INTEGER NO-UNDO</span src-keyword>.
<span class="src-keyword">DEF VAR</span src-keyword> MinorVersion <span class="src-keyword">AS INTEGER NO-UNDO</span src-keyword>.
<span class="src-keyword">DEF VAR</span src-keyword> ReturnValue <span class="src-keyword">AS INTEGER NO-UNDO</span src-keyword>.

<span class="src-keyword">SET-SIZE</span src-keyword>(lpVersionInfo) = <span class="src-number">148</span src-number>.
<span class="src-keyword">PUT-LONG</span src-keyword>(lpVersionInfo,<span class="src-number">1</span src-number>) = <span class="src-number">148</span src-number>.
<span class="src-keyword">RUN</span src-keyword> GetVersionExA <span class="src-keyword">IN</span src-keyword> hpApi( <span class="src-keyword">GET-POINTER-VALUE</span src-keyword>(lpVersionInfo),
<span class="src-keyword">OUTPUT</span src-keyword> ReturnValue).
dwPlatformID = <span class="src-keyword">GET-LONG</span src-keyword>(lpVersionInfo,<span class="src-number">17</span src-number>).
MinorVersion = <span class="src-keyword">GET-BYTE</span src-keyword>(lpVersionInfo,<span class="src-number">15</span src-number>).

Win98 = (dwPlatformId=<span class="src-number">1</span src-number> <span class="src-keyword">AND</span src-keyword> MinorVersion=<span class="src-number">10</span src-number>).

<span class="src-keyword">SET-SIZE</span src-keyword>(lpVersionInfo) = <span class="src-number">0</span src-number>.
<span class="src-keyword">RETURN</span src-keyword> Win98.

<span class="src-keyword">END FUNCTION</span src-keyword>.

<span class="src-keyword">FUNCTION</span src-keyword> RunningWindowsNT4 <span class="src-keyword">RETURNS LOGICAL</span src-keyword> () :
<span class="src-comment">/* returns TRUE if you are running Windows NT4.
I have not had a chance to test this yet */</span src-comment>

<span class="src-keyword">DEF VAR</span src-keyword> NT4 <span class="src-keyword">AS LOGICAL NO-UNDO</span src-keyword>.
<span class="src-keyword">DEF VAR</span src-keyword> lpVersionInfo <span class="src-keyword">AS MEMPTR</span src-keyword>.
<span class="src-keyword">DEF VAR</span src-keyword> dwPlatformID <span class="src-keyword">AS INTEGER NO-UNDO</span src-keyword>.
<span class="src-keyword">DEF VAR</span src-keyword> MajorVersion <span class="src-keyword">AS INTEGER NO-UNDO</span src-keyword>.
<span class="src-keyword">DEF VAR</span src-keyword> ReturnValue <span class="src-keyword">AS INTEGER NO-UNDO</span src-keyword>.

<span class="src-keyword">SET-SIZE</span src-keyword>(lpVersionInfo) = <span class="src-number">148</span src-number>.
<span class="src-keyword">PUT-LONG</span src-keyword>(lpVersionInfo,<span class="src-number">1</span src-number>) = <span class="src-number">148</span src-number>.
<span class="src-keyword">RUN</span src-keyword> GetVersionExA <span class="src-keyword">IN</span src-keyword> hpApi( <span class="src-keyword">GET-POINTER-VALUE</span src-keyword>(lpVersionInfo),
<span class="src-keyword">OUTPUT</span src-keyword> ReturnValue).

dwPlatformID = <span class="src-keyword">GET-LONG</span src-keyword>(lpVersionInfo,<span class="src-number">17</span src-number>).
MajorVersion = <span class="src-keyword">GET-BYTE</span src-keyword>(lpVersionInfo, <span class="src-number">5</span src-number>).

NT4 = (dwPlatformId=<span class="src-number">2</span src-number> <span class="src-keyword">AND</span src-keyword> MajorVersion=<span class="src-number">4</span src-number>).

<span class="src-keyword">SET-SIZE</span src-keyword>(lpVersionInfo) = <span class="src-number">0</span src-number>.
<span class="src-keyword">RETURN</span src-keyword> NT4.

<span class="src-keyword">END FUNCTION</span src-keyword>.

<span class="src-keyword">FUNCTION</span src-keyword> RunningWindows2000 <span class="src-keyword">RETURNS LOGICAL</span src-keyword> () :
<span class="src-comment">/* returns TRUE if you are running Windows 2000
This function is not tested at all */</span src-comment>

<span class="src-keyword">DEF VAR</span src-keyword> Win2000 <span class="src-keyword">AS LOGICAL NO-UNDO</span src-keyword>.
<span class="src-keyword">DEF VAR</span src-keyword> lpVersionInfo <span class="src-keyword">AS MEMPTR</span src-keyword>.
<span class="src-keyword">DEF VAR</span src-keyword> dwPlatformID <span class="src-keyword">AS INTEGER NO-UNDO</span src-keyword>.
<span class="src-keyword">DEF VAR</span src-keyword> MajorVersion <span class="src-keyword">AS INTEGER NO-UNDO</span src-keyword>.
<span class="src-keyword">DEF VAR</span src-keyword> ReturnValue <span class="src-keyword">AS INTEGER NO-UNDO</span src-keyword>.

<span class="src-keyword">SET-SIZE</span src-keyword>(lpVersionInfo) = <span class="src-number">148</span src-number>.
<span class="src-keyword">PUT-LONG</span src-keyword>(lpVersionInfo,<span class="src-number">1</span src-number>) = <span class="src-number">148</span src-number>.
<span class="src-keyword">RUN</span src-keyword> GetVersionExA <span class="src-keyword">IN</span src-keyword> hpApi( <span class="src-keyword">GET-POINTER-VALUE</span src-keyword>(lpVersionInfo),
<span class="src-keyword">OUTPUT</span src-keyword> ReturnValue).

dwPlatformID = <span class="src-keyword">GET-LONG</span src-keyword>(lpVersionInfo,<span class="src-number">17</span src-number>).
MajorVersion = <span class="src-keyword">GET-BYTE</span src-keyword>(lpVersionInfo, <span class="src-number">5</span src-number>).

Win2000 = (dwPlatformId=<span class="src-number">2</span src-number> <span class="src-keyword">AND</span src-keyword> MajorVersion=<span class="src-number">5</span src-number>).

<span class="src-keyword">SET-SIZE</span src-keyword>(lpVersionInfo) = <span class="src-number">0</span src-number>.
<span class="src-keyword">RETURN</span src-keyword> Win2000.

<span class="src-keyword">END FUNCTION</span src-keyword>.
</pre>
</td></tr></TABLE>

<h3>Another convenient function</h3>
<i>Brad Long &lt;bjl@uq.net.au&gt;</i> added this procedure which is indeed convenient.
<TABLE BORDER WIDTH=100% BGCOLOR=white class="voorbeeld"><tr><td>
<pre>
<span class="src-keyword">FUNCTION</span src-keyword> WINGetVersion <span class="src-keyword">RETURNS CHARACTER</span src-keyword> () :
<span class="src-comment">/*-----------------------------------------------------------------------------
Purpose: Calls the WINAPI function GetVersionExA to determine the version
of the Windows operating system that is running on the machine.
Notes: Returns "95" for Windows 95, "98" for Windows 98, "NT" for Windows NT
Returns "undef" if unable to determine platform.
------------------------------------------------------------------------------*/</span src-comment>

<span class="src-keyword">DEF VAR</span src-keyword> v_version-buf <span class="src-keyword">AS MEMPTR</span src-keyword>.
<span class="src-keyword">DEF VAR</span src-keyword> v_platform-id <span class="src-keyword">AS INTEGER NO-UNDO</span src-keyword>.
<span class="src-keyword">DEF VAR</span src-keyword> v_platform-desc <span class="src-keyword">AS CHAR NO-UNDO</span src-keyword>.
<span class="src-keyword">DEF VAR</span src-keyword> v_major-version <span class="src-keyword">AS INTEGER NO-UNDO</span src-keyword>.
<span class="src-keyword">DEF VAR</span src-keyword> v_minor-version <span class="src-keyword">AS INTEGER NO-UNDO</span src-keyword>.
<span class="src-keyword">DEF VAR</span src-keyword> v_return-value <span class="src-keyword">AS INTEGER NO-UNDO</span src-keyword>.

<span class="src-keyword">SET-SIZE</span src-keyword>(v_version-buf) = <span class="src-number">148</span src-number>.
<span class="src-keyword">PUT-LONG</span src-keyword>(v_version-buf,<span class="src-number">1</span src-number>) = <span class="src-number">148</span src-number>.

<span class="src-keyword">RUN</span src-keyword> GetVersionExA (<span class="src-keyword">INPUT GET-POINTER-VALUE</span src-keyword>(v_version-buf),
<span class="src-keyword">OUTPUT</span src-keyword> v_return-value).

v_platform-id = <span class="src-keyword">GET-LONG</span src-keyword>(v_version-buf,<span class="src-number">17</span src-number>).

<span class="src-keyword">CASE</span src-keyword> v_platform-id:
<span class="src-keyword">WHEN</span src-keyword> <span class="src-number">1</span src-number> <span class="src-keyword">THEN DO</span src-keyword>:
v_minor-version = <span class="src-keyword">GET-BYTE</span src-keyword>(v_version-buf,<span class="src-number">15</span src-number>).
v_major-version = <span class="src-keyword">GET-BYTE</span src-keyword>(v_version-buf,<span class="src-number">16</span src-number>).
<span class="src-keyword">END</span src-keyword>.
<span class="src-keyword">OTHERWISE DO</span src-keyword>:
v_major-version = <span class="src-keyword">GET-LONG</span src-keyword>(v_version-buf,<span class="src-number">5</span src-number>).
v_minor-version = <span class="src-keyword">GET-LONG</span src-keyword>(v_version-buf,<span class="src-number">9</span src-number>).
<span class="src-keyword">END</span src-keyword>.
<span class="src-keyword">END</span src-keyword>.

<span class="src-keyword">CASE</span src-keyword> v_platform-id:
<span class="src-keyword">WHEN</span src-keyword> <span class="src-number">0</span src-number> <span class="src-keyword">THEN</span src-keyword> v_platform-desc = <span class="src-char">"3.1"</span src-char>.
<span class="src-keyword">WHEN</span src-keyword> <span class="src-number">1</span src-number> <span class="src-keyword">THEN</span src-keyword>
<span class="src-keyword">DO</span src-keyword>:
<span class="src-keyword">IF</span src-keyword> v_minor-version <span class="src-keyword">EQ</span src-keyword> <span class="src-number">0</span src-number> <span class="src-keyword">THEN</span src-keyword> v_platform-desc = <span class="src-char">"95"</span src-char>.
<span class="src-keyword">ELSE IF</span src-keyword> v_minor-version <span class="src-keyword">GT</span src-keyword> <span class="src-number">0</span src-number> <span class="src-keyword">THEN</span src-keyword> v_platform-desc = <span class="src-char">"98"</span src-char>.
<span class="src-keyword">ELSE</span src-keyword> v_platform-desc = <span class="src-char">"undef"</span src-char>.
<span class="src-keyword">END</span src-keyword>.
<span class="src-keyword">WHEN</span src-keyword> <span class="src-number">2</span src-number> <span class="src-keyword">THEN</span src-keyword>
v_platform-desc = <span class="src-char">"NT"</span src-char>.
<span class="src-keyword">OTHERWISE</span src-keyword>
v_platform-desc = <span class="src-char">"undef"</span src-char>.
<span class="src-keyword">END</span src-keyword>.

<span class="src-keyword">SET-SIZE</span src-keyword>(v_version-buf) = <span class="src-number">0</span src-number>.

<span class="src-keyword">RETURN</span src-keyword> v_platform-desc.

<span class="src-keyword">END FUNCTION</span src-keyword>.
</pre>
</td></tr></TABLE>
 
Top