ネイティブの fprint() ox 関数を介して、外部の c++ dll で作成されたファイルに書き込もうとしています。
私のC++コードは(C.BosのGnuDrawパッケージのsrcコードに触発された)です:
#define OxSetOpenFile(pv,i,d,f) (pv)[i].type = OX_FILE, (pv)[i].t.ioval.fp = d, (pv)[i].t.ioval.fmode = f
extern "C" void OXCALL fopen_C(OxVALUE *rtn, OxVALUE *pv, int cArg)
{
char *sFile;
FILE *fh;
if (cArg != 1)
OxRunError(ER_ARGS, NULL);
OxLibCheckType(OX_STRING, pv, 0, 0);
sFile = OxStr(pv, 0);
fh = fopen(sFile, "w");
if (fh == NULL)
OxRunErrorMessage("Oops, I can't open the file");
OxSetOpenFile(rtn, 0, fh, 162); //162 is found in the gnudraw src code
}
Visual Studio 2015 で dll をビルドしましたが、ox からこのファイルに書き込めません。次の Ox コードは fprint() 関数でクラッシュします。
main()
{
decl fh = fopen_C("test.txt");
if(!isfile(fh))
oxrunerror("not file", 0);
fprint(fh, "test text"); /// crash here
}
次のエラー メッセージが表示されました: "Debug Assertion Error" in close.cpp Expression (_osfile(fh) & FOPEN) 。
同様の投稿 ( here ) を見つけましたが、答え ( /MTd または /MDd を使用する - つまり、ランタイムを変更する) は機能しません。この問題は、C で新しい fprintf 関数を作成し、Ox から呼び出すことで解決できます (機能します) が、ネイティブの ox fprint 関数を使用することをお勧めします。私は、この問題はこれに、そして最後に次の質問にリンクできると思います: how to pass a file pointer from c from ox in windows ?