[Delphi7] Run dos command in Console program

Pagina: 1
Acties:
  • 148 views sinds 30-01-2008
  • Reageer

Acties:
  • 0 Henk 'm!

Anoniem: 4411

Topicstarter
Hallo Allemaal,

Kan iemand mij helpen bij het uitvoeren van een programma in een "command prompt" dat wordt gestart vanuit een Delphi 7 Console program?

Het idee is dat ik een bepaald commando (Stel: notepad) wil uitvoeren vanuit mijn Delphi 7 proggie en daarvan de output wil analyseren...
Echter krijg ik het niet voor elkaar een commando uit te laten voeren.

Op deze topic: [rml][ BC3] delphi en dos command?[/rml]
Staat wel een internet adres (waar misschien de oplossing staat) maar deze werkt niet meer :(

Ook heb ik gezocht en geprobeerd met de volgende code:

HINSTANCE ShellExecute(
HWND hwnd, // The parent window
LPCTSTR lpOperation, // "open", "print", "explorer", null
LPCTSTR lpFile, // The file name
LPCTSTR lpParameters, // Command line parameters or null
LPCTSTR lpDirectory, // The default directory or null
INT nShowCmd // One of 12 options - max, min, default ...
);

ShellExecute(Handle, nil, 'notepad.exe', nil, nil, SW_SHOWNORMAL);

Allereerst getest met Alleen ShellExecute, dan krijg ik de melding:
Undeclared Identifier: SW_SHOWNORMAL
Btw.. ik heb wel ShellAPI toegevoegd ;)

De HINSTANCE heb ik ergens gevonden (via Google) maar dat geeft alleen maar meer problemen...

Kan iemand mij hierbij helpen?

Alvast bedankt!

[ Voor 3% gewijzigd door Anoniem: 4411 op 04-11-2003 09:11 ]


Acties:
  • 0 Henk 'm!

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

SW_SHOWNORMAL staat in de Windows unit. HINSTANCE is hetzelfde als het type HINST binnen Delphi. Als je je problem wilt oplossen door ons zal je toch echt moeten vertellen wat de problemen zijn. :)

Zoek ook gewoon eens op ShellExecute, want het heeft niets specifieks met Delphi of command prompts te maken. Het is een gewone WinAPI call.

We adore chaos because we like to restore order - M.C. Escher


Acties:
  • 0 Henk 'm!

Anoniem: 4411

Topicstarter
LordLarry schreef op 04 november 2003 @ 09:26:
SW_SHOWNORMAL staat in de Windows unit. HINSTANCE is hetzelfde als het type HINST binnen Delphi. Als je je problem wilt oplossen door ons zal je toch echt moeten vertellen wat de problemen zijn. :)

Zoek ook gewoon eens op ShellExecute, want het heeft niets specifieks met Delphi of command prompts te maken. Het is een gewone WinAPI call.
LordLarry:
Ik heb reeds gezocht in de help op ShellExecute, ik kom dan alleen uit op TCustomFileRun. Ik kan er alleen niet achter komen hoe ik deze dan moet gebruiken.

Het probleem waar ik tegenaanloop is dat als ik ShellExecute gebruik, dat SW_SHOWNORMAL niet werkt (maar ook de andere 11 soorten niet). Ik maak niet gebruik van de Windows unit, aangezien ik een Console Application aan het proggen ben...

Acties:
  • 0 Henk 'm!

Anoniem: 42142

Anoniem: 4411 schreef op 04 november 2003 @ 09:38:
LordLarry:
Ik heb reeds gezocht in de help op ShellExecute, ik kom dan alleen uit op TCustomFileRun. Ik kan er alleen niet achter komen hoe ik deze dan moet gebruiken.
Zoek niet in alleen in de help maar ook met de search alhier en bijv. via google. Ik denk dat je voorbeelden te over krijgt.
Het probleem waar ik tegenaanloop is dat als ik ShellExecute gebruik, dat SW_SHOWNORMAL niet werkt (maar ook de andere 11 soorten niet). Ik maak niet gebruik van de Windows unit, aangezien ik een Console Application aan het proggen ben...
En waarom zou je dan niet de windows api gebruiken? Die Console Application's van Delphi draaien alleen onder Win32 hoor (ze doen het niet onder DOS mocht je dat soms denken); dus is het onzin om geen Windows API te gebruiken.

Acties:
  • 0 Henk 'm!

Anoniem: 4411

Topicstarter
Ah... oke...

Ik ga ff verder kijken...
Bedankt.

Acties:
  • 0 Henk 'm!

  • Dala
  • Registratie: November 2000
  • Laatst online: 02-06 08:58
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
procedure ShellExecute_AndWait(FileName, par: string);
var 
  exInfo: TShellExecuteInfo;
  Ph: DWORD; 
begin 
  FillChar(exInfo, SizeOf(exInfo), 0);
  with exInfo do
  begin 
    cbSize := SizeOf(exInfo); 
    fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_DDEWAIT; 
    Wnd := GetActiveWindow(); 
    ExInfo.lpVerb := 'open'; 
    lpFile := PChar(FileName);
    lpParameters := pchar(par); 
    nShow := SW_SHOWNORMAL; 
  end; 
  if ShellExecuteEx(@exInfo) then 
  begin 
    Ph := exInfo.HProcess; 
  end 
  else 
  begin
   Exit;
  end;
  while WaitForSingleObject(ExInfo.hProcess, 50) <> WAIT_OBJECT_0 do
    Application.ProcessMessages;
  CloseHandle(Ph);
end;


Deze heb ik ooit eens gevonden en aangepast, kun je dus op verder brijen :)

Acties:
  • 0 Henk 'm!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 27-05 16:00

curry684

left part of the evil twins

ShellExecute(Ex) hoor je alleen te gebruiken als je het bestandstype niet kent en gewoon de system-match voor een applicatie wil openen. Dit kan extreem vreemde effecten opleveren :)

Voor gewoon een executable te starten dien je CreateProcess te gebruiken, zie MSDN Library Online.

Professionele website nodig?


Acties:
  • 0 Henk 'm!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 27-05 16:00

curry684

left part of the evil twins

Anoniem: 42142 schreef op 04 november 2003 @ 10:53:
En waarom zou je dan niet de windows api gebruiken? Die Console Application's van Delphi draaien alleen onder Win32 hoor (ze doen het niet onder DOS mocht je dat soms denken); dus is het onzin om geen Windows API te gebruiken.
Helaas een van de hardnekkigste misverstanden rondom Windows programmeren is dat een DOS-programma en een consoleprogramma hetzelfde zijn. Dat is dus idd pertinent niet waar.

DOS programma's zijn 16-bit console programma's die in een emulated zandbak draaien op Win95 of later, om precies te zijn draaien ze binnen een WOWEXEC process (WOW = Windows On Windows).

Een Win32 console programma is gewoon een fully-fledged Windows 32-bit applicatie met als zo ongeveer enige verschil dat het default een consolewindow voor in- en output aanmaakt. Je kunt probleemloos in een console app windows aanmaken en een messageloop starten (ergo: complete Windows-app).

Professionele website nodig?


Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08

Acties:
  • 0 Henk 'm!

Anoniem: 42142

curry684 schreef op 04 november 2003 @ 12:19:
[...]

Helaas een van de hardnekkigste misverstanden rondom Windows programmeren is dat een DOS-programma en een consoleprogramma hetzelfde zijn. Dat is dus idd pertinent niet waar.

DOS programma's zijn 16-bit console programma's die in een emulated zandbak draaien op Win95 of later, om precies te zijn draaien ze binnen een WOWEXEC process (WOW = Windows On Windows).

Een Win32 console programma is gewoon een fully-fledged Windows 32-bit applicatie met als zo ongeveer enige verschil dat het default een consolewindow voor in- en output aanmaakt. Je kunt probleemloos in een console app windows aanmaken en een messageloop starten (ergo: complete Windows-app).
En nog een verschil: 'Normale' Win32 applicatie heeft een WinMain en een 'Console' Win32 Applicatie een main.

Acties:
  • 0 Henk 'm!

  • Just_a_Gamer
  • Registratie: November 2001
  • Laatst online: 18:02
Misschien is dit meer wat voor jou:

http://www.nldelphi.com/f...hp?postid=29743#post29743

Daar in staat ook hoe je de uitvoer van een dos kan capturen.
Pagina: 1