嵌りに嵌ったのでメモ.Ghostscript は,コマンドライン(多くの場合 gs.Windows だと gswin32c)の他にライブラリから API を直接呼び出す方法が提供されています.これらの API の基本的な使い方は,以下のように gsapi_new_instance(), gsapi_init_with_args(), gsapi_exit(), gsapi_delete_instance() を順に呼び出していくだけのシンプルなものです.
gs_main_instance* instance; if (gsapi_new_instance(&instance, NULL) < 0) { throw std::runtime_error("failed to create instance"); } char *args[10]; // ... // args に必要な引数を設定していく. const int status = gsapi_init_with_args(instance, 10, args); gsapi_exit(instance); gsapi_delete_instance(gs_main_instance *instance); if (status < 0) throw std::runtime_error("ghostscript error");
しかし,これらの API のうち gsapi_init_with_args() にちょっと注意しておかなければならない事がありました.
gsapi_init_with_args()
Initialise the interpreter. This calls gs_main_init_with_args() in imainarg.c. See below for return codes. The arguments are the same as the "C" main function: argv[0] is ignored and the user supplied arguments are argv[1] to argv[argc-1].
The Ghostscript Interpreter Application Programming Interface (API)
通常,コマンドラインから実行する場合,最初の引数には実行したプログラム名が設定されます.Ghostscript は,API で使用する場合もそれと同じような形になっている事を想定しているため,gsapi_init_with_args() に渡した配列の最初(0番目)の要素は無視するようです.そのため,配列に引数を格納していく場合は,実際の引数は1番目から格納していく必要があります.
これに気づかずに,配列の0番目から引数を指定していたためにかなりの時間嵌ってしまいました.