简体   繁体   English

如何从 C 程序调用 notepad.exe?

[英]How can I call notepad.exe from a C program?

i have written a time table program in c我在 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,"\n %s TIMETABLE IS AS FOLLOWS\n",day);
    fprintf(fp,"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
    fprintf(fp,"|~~~~~~~~~|~~~~~~~~~~~~~~~|~~~~~~~~~~~~~~|~~~~~~~~~~|\n");
    fprintf(fp,"| TIME    | 12.30-1.30    | 1.35-2.40    |2.45-3.50 |\n");
    fprintf(fp,"|~~~~~~~~~|~~~~~~~~~~~~~~~|~~~~~~~~~~~~~~|~~~~~~~~~~|\n");
    fprintf(fp,"| SUBJECT *     %s     * %s  * %s|\n",sub1,sub2,sub3);
    fprintf(fp,"|~~~~~~~~~|~~~~~~~~~~~~~~~|~~~~~~~~~~~~~~|~~~~~~~~~~|\n");
    i++;
  }
  printf(" Time table has been Created in the File aa.txt successfully");
  getch();
}

when i finish the timetable.当我完成时间表。 the time table is created in a.txt file.时间表在 a.txt 文件中创建。 i want that file to be opened and show me automatically in a notepad.我希望打开该文件并在记事本中自动显示。 how to program that in c?如何在 c 中编程?

Use利用

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

Dani already described the easier way (using system ), so I'll just describe the other (more complicated but also more flexible) way to do it using the Windows API . Dani 已经描述了更简单的方法(使用system ),所以我将只描述另一种(更复杂但也更灵活)使用Windows API的方法。 Browsing the API (Overview -> System Services -> Processes and Threads), there's a small example on how to create a process using the CreateProcess() function.浏览 API(概述 -> 系统服务 -> 进程和线程),有一个关于如何使用 CreateProcess() function 创建进程的小示例。 In your case:在你的情况下:

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

And then wait for the Notepad process to exit, as described in the example.然后等待记事本进程退出,如示例中所述。

Third way: use the ShellExecute shell function telling to the shell to "just open the file" with the default editor:第三种方式:使用ShellExecute shell function 告诉 shell 使用默认编辑器“打开文件”:

#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.");
}

This will open aa.txt with the default editor for txt files.这将使用txt文件的默认编辑器打开aa.txt

In my opinion, this is the best solution:在我看来,这是最好的解决方案:

  • it respects the user's choice for the editor (unlike CreateProcess , which just opens notepad.exe );它尊重用户对编辑器的选择(与只打开notepad.exeCreateProcess不同); if I set PSPad as the default editor for txt files, it will pop up PSPad and not notepad.如果我将 PSPad 设置为 txt 文件的默认编辑器,它将弹出 PSPad 而不是记事本。

  • it doesn't have problems with search paths for the editor (where is notepad.exe ?)编辑器的搜索路径没有问题( notepad.exe在哪里?)

  • its behavior is fully defined, unlike the system function, which relies on command.com / cmd.exe , which have subtle differences between Windows versions and don't give you any documented/easy way to check if the operation succeeded; its behavior is fully defined, unlike the system function, which relies on command.com / cmd.exe , which have subtle differences between Windows versions and don't give you any documented/easy way to check if the operation succeeded;

  • it doesn't give you any "false feeling of portability" like the system , that will happily compile on a Linux machine but will simply not work at runtime.它不会像system那样给你任何“错误的可移植感”,它会在 Linux 机器上愉快地编译,但在运行时根本无法工作。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM