?
Solved

Get windows temp dir(16-bit)

Posted on 1998-08-27
14
Medium Priority
?
409 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:tomcorcoran
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 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:tomcorcoran
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
Industry Leaders: 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:tomcorcoran
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:tomcorcoran
ID: 1337951
Kineng, I can't believe I overlooked that, thanks a million. Ronnit, thatns for the link, interesting stuff. Tom.
0

Featured Post

What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

Question has a verified solution.

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

The uses clause is one of those things that just tends to grow and grow. Most of the time this is in the main form, as it's from this form that all others are called. If you have a big application (including many forms), the uses clause in the in…
In my programming career I have only very rarely run into situations where operator overloading would be of any use in my work.  Normally those situations involved math with either overly large numbers (hundreds of thousands of digits or accuracy re…
NetCrunch network monitor is a highly extensive platform for network monitoring and alert generation. In this video you'll see a live demo of NetCrunch with most notable features explained in a walk-through manner. You'll also get to know the philos…
This tutorial will teach you the special effect of super speed similar to the fictional character Wally West aka "The Flash" After Shake : http://www.videocopilot.net/presets/after_shake/ All lightning effects with instructions : http://www.mediaf…
Suggested Courses

741 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