windows - Hvordan kan jeg ringe notepad.exe fra et C-program?

Indlæg af Hanne Mølgaard Plasc

Problem



jeg har skrevet et tidtabellen program i c


#include<stdio.h> 
#include<conio.h> 
void main()
{
  int i=0;
  int selection;
  char day[20];
  char sub1[20];
  char sub2[20];
  char sub3[20];
  FILE *fp;
  fp=fopen("aa.txt","w");
  textcolor(5);
  textbackground(3);
  clrscr();
  while(i<3)
  {
    printf("Enter the day ");
    scanf("\%s",day);
    printf("Enter the period 12.30-1:30 ");
    scanf("\%s",sub1);
    printf("Enter the period 1.35-2.40 ");
    scanf("\%s",sub2);
    printf("Enter the period 2.45-3.50 ");
    scanf("\%s",sub3);
    fprintf(fp,"
 \%s TIMETABLE IS AS FOLLOWS
",day);
    fprintf(fp,"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
");
    fprintf(fp,"|~~~~~~~~~|~~~~~~~~~~~~~~~|~~~~~~~~~~~~~~|~~~~~~~~~~|
");
    fprintf(fp,"| TIME    | 12.30-1.30    | 1.35-2.40    |2.45-3.50 |
");
    fprintf(fp,"|~~~~~~~~~|~~~~~~~~~~~~~~~|~~~~~~~~~~~~~~|~~~~~~~~~~|
");
    fprintf(fp,"| SUBJECT *     \%s     * \%s  * \%s|
",sub1,sub2,sub3);
    fprintf(fp,"|~~~~~~~~~|~~~~~~~~~~~~~~~|~~~~~~~~~~~~~~|~~~~~~~~~~|
");
    i++;
  }
  printf(" Time table has been Created in the File aa.txt successfully");
  getch();
}


når jeg er færdig med tidsplanen. tidsplanen oprettes i en.txt-fil. Jeg vil have den fil, der skal åbnes og vise mig automatisk i et notesblok. hvordan man programmerer det i c?

Bedste reference


Brug


system("notepad.exe aa.txt");

Andre referencer 1


Dani beskrev allerede den nemmere måde (ved hjælp af system), så jeg vil bare beskrive den anden (mere komplicerede men også mere fleksible) måde at gøre det ved hjælp af Windows API. Gennemse API'en (Oversigt -> System Services - > Processer og tråde), der er et lille eksempel på, hvordan man opretter en proces ved hjælp af CreateProcess () -funktionen. I dit tilfælde: [16] [17]


CreateProcess("notepad.exe",   // Name of program to execute
    "aa.txt",                  // Command line
    NULL,                      // Process handle not inheritable
    NULL,                      // Thread handle not inheritable
    FALSE,                     // Set handle inheritance to FALSE
    0,                         // No creation flags
    NULL,                      // Use parent's environment block
    NULL,                      // Use parent's starting directory 
    &si,                       // Pointer to STARTUPINFO structure
    &pi);                      // Pointer to PROCESS\_INFORMATION structure


Og vent derefter på Notepad-processen for at afslutte, som beskrevet i eksemplet.

Andre referencer 2


Tredje måde: Brug funktionen ShellExecute shell til at fortælle shellet at 'bare åbne filen' med standardredigeren: [18]


#include <windows.h>
#include <Shellapi.h>

// ...

if(ShellExecute(
    NULL,     // No parent window for error message boxes/...
    "open",   // Shell action ("verb") to be performed on the file (as opposed to "print", "explore", ...)
    "aa.txt", // File to be opened
    NULL,     // Command-line parameters - not used when opening documents
    NULL,     // Working directory - the current one is used by default
    SW\_SHOW   // State of the window of the application being launched - SW\_SHOW is the default
    )<=(HINSTANCE)32     // If ShellExecute returns a value <=32 it means that an error has occurred
   )
{
    puts("Cannot open aa.txt with the default editor - ShellExecute failed.");
}


Dette åbner aa.txt med standardredaktøren for txt filer.


Det er efter min mening den bedste løsning:



  • det respekterer brugerens valg til redaktøren (i modsætning til CreateProcess, som netop åbner notepad.exe); hvis jeg sætter PSPad som standardredaktør for txt-filer, vil det komme op på PSPad og ikke notesblok.

  • Det har ikke problemer med søgeveje til editoren (hvor er notepad.exe?)

  • dets opførsel er fuldt defineret, i modsætning til funktionen system, som bygger på command.com/cmd.exe, som har subtile forskelle mellem Windows-versioner og giver dig ingen dokumenterede/nemme måde at kontrollere om operationen lykkedes

  • Det giver dig ikke nogen 'falsk følelse af overførbarhed' som system, som med glæde kompilerer på en Linux-maskine, men vil simpelthen ikke virke ved kørsel.