1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

Determine if program started from command prompt

Discussion in 'Support' started by Joe Caverly, Jan 8, 2015.

  1. Joe Caverly

    Joined:
    Aug 28, 2009
    Messages:
    680
    Likes Received:
    8
    I am using;
    Code:
    TCC  17.00.67  Windows Vista [Version 6.0.6002]
    TCC Build 67  Windows Vista Build 6002  Service Pack 2
    When I run this code from CMD.EXE, the program returns;
    Code:
    Started from command prompt
    When I run it from TCC, either in TCMD, or in a detached TCC session, it returns;
    Code:
    NOT started from command prompt
    Code:
    #COMPILE EXE
    #INCLUDE "win32api.inc"
    
    FUNCTION StartedFromConsole() AS LONG
    LOCAL lpStartupInfo AS STARTUPINFO
    lpStartupInfo.cb = SIZEOF(STARTUPINFO): GetStartupInfo lpStartupInfo
    IF lpStartupInfo.dwXSize <> 0 OR lpStartupInfo.dwYSize <> 0 THEN FUNCTION = %TRUE
    END FUNCTION
    
    FUNCTION PBMAIN () AS LONG
    IF StartedFromConsole = %TRUE THEN
    ? "Started from command prompt"
    ELSE
    ? "NOT started from command prompt"
    SLEEP 2000 '// add a delay here to give the user time to read the console before it ends
    END IF
    END FUNCTION
    Why does this work properly in CMD.EXE, but not in TCC.EXE?

    Joe
     
  2. vefatica

    Joined:
    May 20, 2008
    Messages:
    7,959
    Likes Received:
    30
    I don't know what "work properly" means in this case. I'd expect very unreliable results from that code. Any parent app, windowed or console, may or may not use STARTF_USESIZE (if it uses CreateProcess at all), and may or may not specify dwXSize or dwYSize as non-zero. Perhaps I've missed something.

    I'd guess the best you could do (not perfect) is (1) get the parent process's PID, (2) if (big if) the parent process is still running, get the name of its EXE, and (3) plow through the headers of that EXE to determine if it's a console app or a GUI app.
     
  3. vefatica

    Joined:
    May 20, 2008
    Messages:
    7,959
    Likes Received:
    30
    This ought to work also (assuming the parent process still exists).

    Get the parent process's PID (CreateToolhelp32Snapshot() perhaps) and then attempt AttachConsole(dwParentPid).
     

Share This Page