Get windows temp dir(16-bit)

I use the follwoing routines to get the windows temp directory, however the 16-bit version hangs my machine, has anyone any ideas why? Thansk a lot, Tom.

{$IFDEF WIN32}
function GetWinTempDir: string;
var
   pWinTempDir: array[0..255] of Char;
begin
   GetTempPath(SizeOf(pWinTempDir), pWinTempDir);
   Result := AddSlashIfNeeded(StrPas(pWinTempDir));
end;
{$ELSE}
{ debug - does not work }
function GetWinTempDir: string;
   { Function which retrieves the value of a DOS environment variable }
   function GetEnvVar(const VarStr: string): string;
   var
      PEnv, PVarStr, PEquals: PChar;
   begin
      Result := '';

      PVarStr := AllocateSpace(Length(VarStr) + 1);

      try
         { Copy pascal-style string into a null-terminated one }
         StrPCopy(PVarStr, VarStr);

         { Get the DOS environment strings }
         PEnv := GetDOSEnvironment;

         { Step through each individual environment string and look for
           the one which is required }
         while (PEnv^ <> #0) do begin
             { Find the position of '=' in the string }
             PEquals := StrScan(PEnv, '=');

             if (PEquals <> nil) then begin
                 if (StrLIComp(PEnv, PVarStr, (PEquals - PEnv)) = 0) then begin
                    { Found it! }
                    Inc(PEquals, 1);
                    Result := StrPas(PEquals);
                    Break;
                 end;
             end;
             Inc(PEnv, StrLen(PEnv) + 1);
         end;
      finally
         FreeSpace(PVarStr, Length(VarStr) + 1);
      end;
   end;
begin
   GetEnvVar('TEMP');
end;
{$ENDIF}
boardtcAsked:
Who is Participating?
 
kjtengConnect With a Mentor Commented:
1. You forgot to assign the result for GetWinTempDir
2. use strAlloc and strDispose

Admende code:


function GetWinTempDir: string;
      { Function which retrieves the value of a DOS environment variable }
      function GetEnvVar(const VarStr: string): string;
      var
         PEnv, PVarStr, PEquals: PChar;  s:string;
      begin
         Result := '';

         PVarStr := StrAlloc(Length(VarStr) + 1);
           s:= StrPas( pVarStr);
         try
            { Copy pascal-style string into a null-terminated one }
            StrPCopy(PVarStr, VarStr);

            { Get the DOS environment strings }
            PEnv := GetDOSEnvironment;

            { Step through each individual environment string and look for
              the one which is required }
            while (PEnv^ <> #0) do begin
                { Find the position of '=' in the string }
                PEquals := StrScan(PEnv, '=');

                if (PEquals <> nil) then begin
                    if (StrLIComp(PEnv, PVarStr, (PEquals - PEnv)) = 0) then begin
                       { Found it! }
                       Inc(PEquals, 1);
                       Result := StrPas(PEquals);
                       Break;
                    end;
                end;
                Inc(PEnv, StrLen(PEnv) + 1);
            end;
         finally
            StrDispose(PVarStr);
         end;
      end;
   begin
      Result := GetEnvVar('TEMP');
   end;

0
 
ronit051397Commented:
I think in 16 bit you shoud use GetTempDrive
0
 
boardtcAuthor Commented:
Ronit, I have played with that, that gives the drive - how would you suggest get the path? Tom.
0
Cloud Class® Course: CompTIA Cloud+

The CompTIA Cloud+ Basic training course will teach you about cloud concepts and models, data storage, networking, and network infrastructure.

 
viktornetCommented:
How about this code....???

procedure TForm1.Button1Click(Sender: TObject);
var
  Buffer : array[0..255] of char;
begin
  GetTempPath(SizeOf(Buffer), Buffer);
  ShowMessage(Buffer);
end;

Hope this helps =)

Regards,
Viktor Ivanov
0
 
viktornetCommented:
Opps.......I didn't see your code....sorry...You've used exactly what I gave you..please reject my answer.. :(

Regards,
Viktor Ivanov
0
 
erajojCommented:
Hi Tom,
I'm not sure, but isn't the GetTempPath API function also available in Win16?

This is some old code I found (similar to yours):

{$IFNDEF WIN32}
const MAX_PATH = 144;
{$ENDIF}

function GetTempDirectory: String;
var
  TempDir: array[0..MAX_PATH] of Char;
begin
  GetTempPath(MAX_PATH, @TempDir); // remember the @ operator
  Result := StrPas(TempDir);
end;

/// John
0
 
viktornetCommented:
Hey actually why not try it and see if it works..It's got a slash on the back so you don;t need ot worry about that..Just try if the simple way I gave you works...You've used so much of code..I wonder why???

Regards,
Viktor Ivanov
0
 
ZifNabCommented:
Hi Tom,

Can you try this one? I don't have 16bit OS anymore :

function GetEnvVar(VarName: PChar): PChar;
var
  L: Word;
  P: PChar;
begin
  L := StrLen(VarName);
  P := GetDosEnvironment;
  while P^ <> #0 do
  begin
    if (StrLIComp(P, VarName, L) = 0) and (P[L] = '=') then
    begin
      GetEnvVar := P + L + 1;
      Exit;
    end;
    Inc(P, StrLen(P) + 1);
  end;
  GetEnvVar := nil;
end;

GetEnvVar('TEMP')
or/and GetEnvVar('TMP')

if returns nil --> not temp dir.

Regards, Zif.
0
 
boardtcAuthor Commented:
Thanks guys, I've used so much code tryiung to get around the fact that GetTempPath is not a Win16 call, Victornet - can you do it with less? I'll look at yuor suggestions later, Thanks, Tom.
0
 
ZifNabCommented:
tom, tried my code??
0
 
kjtengCommented:
Hi Tom, does it work?
0
 
ronit051397Commented:
Use GetTempFileName:
Create a new temporary file by using GetTempFileName and then find it's directory which is the Temp directory by using a function like ExtractFileDir.

See the following discussion:
http://x3.dejanews.com/getdoc.xp?AN=285436267&CONTEXT=904457882.687407192&hitnum=17&AH=1
0
 
ronit051397Commented:
Did it helped?
0
 
boardtcAuthor Commented:
Kineng, I can't believe I overlooked that, thanks a million. Ronnit, thatns for the link, interesting stuff. Tom.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.