?
Solved

Get windows temp dir(16-bit)

Posted on 1998-08-27
14
Medium Priority
?
412 Views
Last Modified: 2012-05-04
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}
0
Comment
Question by:boardtc
  • 3
  • 3
  • 3
  • +3
14 Comments
 
LVL 5

Expert Comment

by:ronit051397
ID: 1337938
I think in 16 bit you shoud use GetTempDrive
0
 

Author Comment

by:boardtc
ID: 1337939
Ronit, I have played with that, that gives the drive - how would you suggest get the path? Tom.
0
 
LVL 10

Expert Comment

by:viktornet
ID: 1337940
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
Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
LVL 10

Expert Comment

by:viktornet
ID: 1337941
Opps.......I didn't see your code....sorry...You've used exactly what I gave you..please reject my answer.. :(

Regards,
Viktor Ivanov
0
 
LVL 4

Expert Comment

by:erajoj
ID: 1337942
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
 
LVL 10

Expert Comment

by:viktornet
ID: 1337943
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
 
LVL 8

Expert Comment

by:ZifNab
ID: 1337944
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
 

Author Comment

by:boardtc
ID: 1337945
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
 
LVL 2

Accepted Solution

by:
kjteng earned 200 total points
ID: 1337946
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
 
LVL 8

Expert Comment

by:ZifNab
ID: 1337947
tom, tried my code??
0
 
LVL 2

Expert Comment

by:kjteng
ID: 1337948
Hi Tom, does it work?
0
 
LVL 5

Expert Comment

by:ronit051397
ID: 1337949
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
 
LVL 5

Expert Comment

by:ronit051397
ID: 1337950
Did it helped?
0
 

Author Comment

by:boardtc
ID: 1337951
Kineng, I can't believe I overlooked that, thanks a million. Ronnit, thatns for the link, interesting stuff. Tom.
0

Featured Post

VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

This article explains how to create forms/units independent of other forms/units object names in a delphi project. Have you ever created a form for user input in a Delphi project and then had the need to have that same form in a other Delphi proj…
Introduction The parallel port is a very commonly known port, it was widely used to connect a printer to the PC, if you look at the back of your computer, for those who don't have newer computers, there will be a port with 25 pins and a small print…
Look below the covers at a subform control , and the form that is inside it. Explore properties and see how easy it is to aggregate, get statistics, and synchronize results for your data. A Microsoft Access subform is used to show relevant calcul…
Whether it be Exchange Server Crash Issues, Dirty Shutdown Errors or Failed to mount error, Stellar Phoenix Mailbox Exchange Recovery has always got your back. With the help of its easy to understand user interface and 3 simple steps recovery proced…
Suggested Courses

809 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question