2017-09-08 4 views
0

J'ai cherché beaucoup et je ne trouve pas tout à fait la bonne réponse.Comment ouvrir un fichier .bat (par exemple qui ouvre RandomApp.exe) correctement à partir Delphi7?

Répertoire:

  • Project (Ce dossier contient le code delphi et un dossier appelé "RunThis"

    • RunThis

      • RandomApp.exe
      • Run. bat
      • Config.txt

Code RUN.BAT

start %cd%\RandomApp.exe 
pause 

Delphi 7 (ce code sur Exécute le clic d'un bouton.)

ShellExecute (application.handle, 'open', 'cmd', PChar('cmd.exe /c RunThis\Run.bat'), nil, SW_MAXIMIZE 

Si je N'ajoutez pas la partie 'cmd.exe/c' pour le répertoire, Delphi ouvrira un cmd sans mon code. Si l'on similiar à courir devait cmd.exe .Cependant, si j'ajoute le « cmd.exe/c », il ouvre correctement le RUN.BAT.

Windows le me donne cette erreur: Windows ne peut pas trouver 'C: \ Project \ RunThis \ RandomApp.exe'. Assurez-vous que vous avez tapé le nom correctement le nom, puis réessayez.

Ce qui est drôle à ce sujet est que si je viens double-cliquez sur RUN.BAT, il excutes parfaitement. Cependant, quand je l'ouvre via Delphi, il me donne cette erreur. Je pensais que l'adresse actuelle de Run.bat avait peut-être un problème. Ainsi, au lieu de dire:

start RandomApp.exe 

J'ai utilisé le répertoire complet en cours à la place:

start %cd%\RandomApp.exe  

Juste pour ajouter, quand je suis arrivé Delphi 7 juste ouvrir le programme directement tels que:

ShellExecute(Handle, 'open', PChar('RunThis\RandomApp.exe'),null, null, SW_SHOWNORMAL) ; 

Le programme m'a donné une erreur qu'il n'a pas pu trouver « Config.txt ». RandomApp.exe utilise un fichier texte qui stocke tous ses paramètres.

Encore une fois, si je suffit de cliquer sur RUN.BAT ou RandomApp.exe, ils s'exécutent parfaitement. Le problème est quand j'essaie de l'ouvrir avec du code. J'ai le sentiment que cela a à voir avec le répertoire mais je ne le connais pas bien.

Merci beaucoup.

PS: Exécution de Windows 10.

+1

Pourquoi voudriez-vous demander au shell pour créer un processus de cmd pour exécuter un script pour créer un processus. Pourquoi ne pas créer un processus. Transformez 4 étapes en 1. –

+0

@DavidHeffernan Salut, merci d'avoir pris le temps de répondre. Veuillez prendre note que votre réponse pourrait être beaucoup plus utile si elle incluait quelques conseils ou liens vers les conseils désirés. Donc, si vous le pouvez, aidez-moi s'il vous plaît avec un tel? Je vous remercie. – user3215933

+0

Appelez CreateProcess et transmettez le chemin d'accès au fichier exécutable. –

Répondre

5

Ne comptez pas sur les chemins relatifs, utilisez toujours des chemins absolus.

RandomApp.exe est probablement en utilisant un chemin relatif à trouver Config.txt, mais lorsque vous l'exécutez à partir de votre application, le répertoire de travail en cours est votre dossier de projet, pas le dossier RunThis. C'est pourquoi RandomApp.exe ne trouve pas le fichier. Donc, passez le bon dossier à ShellExecute(), par exemple:

var 
    Folder: string; 
begin 
    Folder := ExtractFilePath(Application.ExeName)+'RunThis\' ; 
    ShellExecute(Application.Handle, nil, PChar(Folder+'Run.bat'), nil, PChar(Folder), SW_MAXIMIZE); 
end; 
+0

Cela fonctionne parfaitement dans Delphi 7. Le 1er paramètre (le HWND) peut être '0', et vous voudrez expérimenter avec le dernier paramètre. Les autres options incluent 'SW_SHOWNORMAL' et' SW_SHOWMINIMIZED'. – AlainD

+2

@AlainD le HWND * peut * être 0, mais * ne devrait pas * être 0, si vous en avez un disponible. En fait, puisque le code est dans un clic de bouton, j'utiliserais HWND du formulaire au lieu de l'application. –

+1

En réalité, il ne devrait y avoir aucun appel à ShellExecute, aucune fenêtre propriétaire, juste un appel à CreateProcess. –