2

ここで明らかな何かが欠けています。DJGPP C コンパイラを使用しています。実行可能ファイルは正常に開くことができますが、デフォルト プログラムのファイルを開くことはできません。

#include <stdio.h>

int main(void) {
    char sys_cmd[100] = "C:\\WINDOWS\\system32\\Calc.exe";
    system(sys_cmd);

    system("\"C:\\TextFile.txt\"");

    system("\"www.bbc.co.uk\"");
    getch();

    return 0;
}

このコードを実行すると、電卓が起動します。電卓を閉じると、次のように報告されます。

Bad command of file name   
Bad command of file name    

したがって、他の 2 つのシステム コールに問題があります。システムコールに「START」を追加しようとしましたが、修正されません。Windows 7 Pro システムを検索したところ、START.EXE がありません。「cmd.exe」を追加するとcmdが起動するだけなので、引数が送信されていないかのようになります。

通常、cmd に「C:\TextFile.txt」と入力すると、内部で TextFile.txt が開かれた notepad.exe が開きます。

とにかく system() よりも安全なものを使用してこれを行うのが理想的ですが、DJGPP で ShellExecute の例を見たことがありません。

4

1 に答える 1

2

djgpp に ShellExecute はありません。これは DOS のみであり、実際の Windows アプリケーションを作成しないため、Windows Api 呼び出しにアクセスできないためです。

ShellExecute は、Windows レジストリを使用して、特定のファイル拡張子を開くために使用する必要があるアプリケーションを見つけることができます。

exec() がこれを実行できるかどうかはわかりませんが、疑問があります。

非常に古いバージョンでは、djgpp でコンパイルされたプログラムから Windows API を呼び出すことができるクロス コンパイラが存在していました。しかし、これはコンパイラの 2.9 バージョンに基づいているため、http ://www.delorie.com/djgpp/v2faq/faq3_6.htmlは行き止まりと見なすことができます。

以下のコメントで説明されているように、.txt からメモ帳への静的マッピングを挿入できます。多くの拡張機能をサポートする必要がある場合、基本的に 2 つの選択肢があります。

  • Windows APIをサポートするコンパイラにコンパイラを切り替えます(他にビジュアルスタジオがあります)
  • ftype と assoc を実行して、どの拡張子がどのプログラムにマップされているかを調べ、dos コンパイラを維持します

djgpp はかなり時代遅れであり、Gcc と同じ更新を受信しないことに注意してください。

「ハック」とは、C プログラムから一時的な .cmd または .bat を作成し、必要なファイルの開始をそのバッチに委任することです。

于 2015-07-05T13:04:49.727 に答える