[Delphi6] ShellExecute Vraagje

Pagina: 1
Acties:

  • DaLass
  • Registratie: Oktober 2001
  • Laatst online: 19:39
Ik ben na een tijdje maar weer eens begonnen met een beetje programmeren.
Nu wil ik een menu maken met rommetjes, die in een lijst komen te staan.

De bedoeling is dat, na het selecteren van een rom, de knop "Run Emu" aangeklikt kan worden.
Deze knop moet een programma starten, met als parameter de juiste rom.

Nu heb ik hier op GoT gevonden dat dit kan met ShellExecute, dus dat heb ik eens geprobeerd.
Ik heb de knop de volgende code geveven:

code:
1
2
3
4
5
procedure TGbaMain.BtnRunEmuClick(Sender: TObject);
 begin
   ShellExecute(Application.Handle,'open','C:\visualboyadvance.exe',
   'C:\0001 - F-Zero (J).gba',nil,SW_SHOWNORMAL);
 end;


Echter, na het klikken op de knop start VisualBoyAdvance met de melding dat hij het bestand C:\0001 niet kan openen.
Hieruit begrijp ik dus dat ShellExecute niet met spaties in de filename overweg kan.
Dit heb ik getest door het bestand te renamen naar 0001.gba en dit in de code te veranderen.
Dan werkt het dus wel, maar dat wil ik niet!

Nu vroeg ik mij af of iemand weet hoe ik deze spaties wel kan laten herkennen, of dat iemand voor mij een vervangende procedure weet om programma + parameter te starten.

Mijn advertenties op V&A


  • Knutselsmurf
  • Registratie: December 2000
  • Laatst online: 22-08 17:59

Knutselsmurf

LED's make things better

Volgens mij kan ShellExecute wel met spaties omgaan, maar het programma dat je aanroept niet. Een mogelijke oplossing, die ook op je command-prompt werkt, is om je parameters tussen aanhalingstekens zet, zodat ze als 1 parameter meegenomen worden. Normaal is namelijk een spatie een scheiding tussen 2 paramters.
Met
code:
1
2
3
4
5
procedure TGbaMain.BtnRunEmuClick(Sender: TObject);
 begin
   ShellExecute(Application.Handle,'open','C:\visualboyadvance.exe',
   '"C:\0001 - F-Zero (J).gba"',nil,SW_SHOWNORMAL);
 end;
heb je grote kans dat het wel werkt. (let op de extra aanhalingstekens !!!)

- This line is intentionally left blank -


  • SWfreak
  • Registratie: Juni 2001
  • Niet online
Probeer eens de boel tussen quotes te zetten, dus
'"C:\0001 - F-Zero (J).gba"'
Is DOS dat niet om kan gaan met die spaties. Denk dat dat meerdere parameters zijn, maar dat is dus niet zo...

  • DaLass
  • Registratie: Oktober 2001
  • Laatst online: 19:39
Tjonge, dat het zoiets simpels kon zijn. Het is opgelost nu. Parameter tussen " " zetten was dus de oplossing.
Bedankt allemaal!!

Mijn advertenties op V&A


  • DaLass
  • Registratie: Oktober 2001
  • Laatst online: 19:39
Ik heb nu met behulp van bovenstaande tips het werkend gekregen, maar wil nu eigenlijk toch meer, dus voeg ik nog maar een vraag aan hetzelfde topic toe:

Eigenlijk wil ik het zo hebben dat, als ik op de button "Run Emu" druk, dat mijn programma geminimaliseerd wordt en VBA gestart wordt met de juiste parameters.
Als het programma VBA gesloten wordt moet mijn programma weer naar voren komen.

Ik weet niet of dit mogelijk is met ShellExecute, maar ik denk het niet.
Ik heb 1 topic gevonden hierover, maar daar werd ik ook niet echt wijs uit.
Het moet iets met handles zijn ofzo?! :?

Is er iemand die mij kan vertellen wat ik moet doen om het werkend te krijgen zoals ik hierboven beschreven heb?

Mijn buttoncode op dit moment is:
code:
1
2
3
4
5
6
7
procedure TGbaMain.BtnRunEmuClick(Sender: TObject);
 begin
   ShellExecute(Application.Handle,'open',
   PChar(GetCurrentDir + '\Data\Vba\VBA.exe'),
   PChar('"' + GetCurrentDir + '\Rom Collection\' + DBFileName.Text + '"'),
   nil,SW_SHOWNORMAL);
 end;

Mijn advertenties op V&A


  • BRAINLESS01
  • Registratie: April 2003
  • Laatst online: 21-08 09:45
volgens mij moet je daarvoor niet ShellExecute maar CreateProcess hebben...

Je moet de handle van het programma dat je opent hebben (dus van VBA), en dan wachten tot het programma is afgesloten.

Met ShellExecute krijg je geen Handle terug (staat op MSDN), maar iets wat erop lijkt. Je kunt hem daardoor WEL gebruiken om te zien of er iets fout is gegaan (Handle <= 32 betekent fout, alles boven 32 betekent goed uitgevoerd), maar NIET om nog eens wat met het geopende programma (VBA) te doen.

Met CreateProcess kan dit dus wel, alhoewel ik niet weet hoe :)

CreateProcess is lastiger te gebruiken, maar ik ga ervan uit dat Delphi ook een STARTUPINFO en PROCESS_INFORMATION enum hebben.

zie hier een C++ stukje voor CreateProcess (onderin) http://www.bridgespublish...external_applications.htm

zoals je ziet heb je dus die STARTUPINFO en PROCESS_INFORMATION nodig, in C# is het mij niet gelukt die om te zetten, daarom gebruik ik nu ShellExecute, maar in Delphi zal het wel werken lijkt me!

succes ermee :)

[ Voor 13% gewijzigd door BRAINLESS01 op 24-04-2003 10:12 ]


  • DaLass
  • Registratie: Oktober 2001
  • Laatst online: 19:39
Hmm.. CreateProcess dus.
Ik zal eens kijken op de opgegeven URL's of ik er wijs uit kan worden.
Is het wel mogelijk dan om mijn zelfgeschreven programma te minimaliseren met CreateProcess?

Andere suggesties zijn natuurlijk ook welkom!

Mijn advertenties op V&A


  • BRAINLESS01
  • Registratie: April 2003
  • Laatst online: 21-08 09:45
je zelfgeschreven programma minimaliseren is heel makkelijk in Delphi... (Al weet ik niet meer hoe, dat is te lang geleden :))

probeer eens iets als Application.Minimize of Form1.Minimize ?

dan als het programma afgesloten word (wat je dus met die Handle zou moeten kunnen afvangen) dan doe je iets als Application.Restore/Application.Maximize (of je form dus)

of misschien moet je de window-state van je form aanpassen door een atribuut te veranderen... Form1.state := wsMinimize; ofzo

  • Schmoove
  • Registratie: Juli 2001
  • Laatst online: 20-08 11:58
Nee inderdaad het is gewoon Form1.minimize.

Of je kunt ook dit gebruiken:
Form1.hide;
Form1.show;

form is dan helemaal weg als je de emulator runt en komt weer terug als je em afsluit.

  • DaLass
  • Registratie: Oktober 2001
  • Laatst online: 19:39
Ik ga het maar eens proberen met form1.hide en form1.show, dat lijkt mij het mooist.
Eerst maar eens kijken of ik CreateProcess aan het werk krijg.

Mijn advertenties op V&A


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

_BRAINLESS schreef op 24 April 2003 @ 10:08:
volgens mij moet je daarvoor niet ShellExecute maar CreateProcess hebben...
Ik zegt het nog maar eens voor de honderdduizendste keer
ShellExecuteEx geeft wel processhandle terug!!!!!

* curry684 wil HTML rechten... :(

[ Voor 6% gewijzigd door curry684 op 24-04-2003 11:39 ]

Professionele website nodig?


  • DaLass
  • Registratie: Oktober 2001
  • Laatst online: 19:39
Curry684, kun jij mij dan vertellen hoe ik mijn idee met ShellExecuteEX werkend moet krijgen?

Mijn advertenties op V&A


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Dat kan ik:
C++:
1
2
3
4
Application.Minimize()
ShellExecuteEx(....)
WaitForSingleObject(ProcessHandle, INFINITE)
Application.Maximize()

Professionele website nodig?


  • DaLass
  • Registratie: Oktober 2001
  • Laatst online: 19:39
Ok, bedankt, maar ik krijg die code niet aan de gang. Waarschijnlijk doe ik iets fout.
Zou het voor delphi wel dezelfde code moeten zijn?
Ik heb ShellApi in mijn "uses" lijst staan.

Als ik achter ShellExecuteEx mijn parameters gooi van ShellExecute gaat ie over zn nek.

Mijn advertenties op V&A


  • BRAINLESS01
  • Registratie: April 2003
  • Laatst online: 21-08 09:45
curry684 schreef op 24 April 2003 @ 11:39:
[...]

Ik zegt het nog maar eens voor de honderdduizendste keer
ShellExecuteEx geeft wel processhandle terug!!!!!

* curry684 wil HTML rechten... :(
hmmm... dat klopt, maar ik kon de SHELLEXECUTEINFO ook niet converteren naar C# :)

ShellExecuteEx@msdn: http://msdn.microsoft.com...ctions/shellexecuteex.asp
SHELLEXECUTEINFO: http://msdn.microsoft.com...ures/shellexecuteinfo.asp
edit:
een van de links was niet top

[ Voor 7% gewijzigd door BRAINLESS01 op 24-04-2003 13:19 ]


  • PKP B-Man
  • Registratie: November 2002
  • Laatst online: 19-07-2023
Deze code werkt in C++ Builder (in delphi zou hij ongeveer exact hetzelfde moeten zijn):
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SHELLEXECUTEINFO sei;
ZeroMemory(&sei, sizeof(SHELLEXECUTEINFO));
sei.cbSize = sizeof(SHELLEXECUTEINFO);
sei.fMask = SEE_MASK_NOCLOSEPROCESS;
sei.lpFile = (LPCSTR)"C:\\winnt\\notepad.exe";
sei.lpParameters = (LPCSTR)NULL;
sei.nShow = SW_SHOW;

ShellExecuteEx(&sei);

if (sei.hProcess)
     WaitForSingleObject(sei.hProcess, INFINITE);
else
     return;

  • DaLass
  • Registratie: Oktober 2001
  • Laatst online: 19:39
Helaas werkt het in Delphi niet. Delphi is het totaal onens met de & tekens die je af en toe in je code hebt staan.
Weghalen heeft ook geen nut en ik weet niet wat ik er anders mee moet doen.

Mijn advertenties op V&A


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Duh! Het schil tussen C en Pascal is wel wat groter dan dat :) PKP B-Man bedoelt dat de strekking van de code hetzelfde moet zijn, alleen dan in Pascal.

& betekent in dit geval dat je het adres ervan wilt hebben

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


  • NaliXL
  • Registratie: Maart 2002
  • Laatst online: 30-07 19:19
Dat zou (uit m'n hoofd) dan dit moeten worden :
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SHELLEXECUTEINFO sei;

ZeroMemory(@sei, sizeof(SHELLEXECUTEINFO));

sei.cbSize       := sizeof(SHELLEXECUTEINFO);
sei.fMask        := SEE_MASK_NOCLOSEPROCESS;
sei.lpFile       := LPCSTR('C:\winnt\notepad.exe');
sei.lpParameters := LPCSTR(NULL);
sei.nShow        := SW_SHOW;

ShellExecuteEx(@sei);

if (sei.hProcess) then begin
    WaitForSingleObject(sei.hProcess, INFINITE);
end else return;

Genoeg is meer dan veel, en tart den overvloed


  • DaLass
  • Registratie: Oktober 2001
  • Laatst online: 19:39
Met een beetje aanpassingen in de code van NaliXL heb ik het werkend gekregen.
Bedankt Allemaal.

Mijn advertenties op V&A

Pagina: 1