Я пытаюсь записать с помощью встроенной функции fprint () ox в файл, созданный во внешнем c ++ dll.
Мой код на C ++ (вдохновлен кодом src GnuDraw Пакет C. Bos):
#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
}
Я создаю dll с Visual Studio 2015, однако я не могу писать из быка в этот файл, следующий сбой кода Ox в функции fprint ():
main()
{
decl fh = fopen_C("test.txt");
if(!isfile(fh))
oxrunerror("not file", 0);
fprint(fh, "test text"); /// crash here
}
Я получил следующее сообщение об ошибке: «Ошибка подтверждения отладки» в выражении close.cpp (_osfile (fh) & FOPEN).
Я нашел похожий пост ( Вот ) но ответ (для использования / MTd или / MDd -ie изменить время выполнения) не работает. Я могу преодолеть эту проблему, создав новую функцию fprintf в C и вызвав ее из Ox (она работает), но я бы предпочел использовать встроенную функцию ox fprint ox. Я думаю, что эта проблема может быть связана с этот, и, наконец, на следующий вопрос: как передать указатель файла с C на быка в Windows?
Наконец то думаю что это невозможно и это вызвано так называемым Dll ограничение границ : Дескрипторы файлов реализованы по-разному, в зависимости от библиотеки времени выполнения C, используемой во время компиляции. Очевидно, что я могу передать указатель файла, но структура дескриптора файла (его структура CRT) не распознается Ox.
Тогда, если моя dll не скомпилирована с той же версией библиотеки времени выполнения C, которая использовалась для компиляции быка, она не будет работать. Этого можно избежать путем динамического связывания с библиотекой C, но поскольку официальный файл DLL (oxwin.dll) скомпилирован со статической связью (как показано в заголовке «Ox Professional версия 7.10 (Windows_64 / U /»)Монтана) ») Это не вариант. Поэтому независимо от того, какую опцию я использую для компиляции своей DLL, Ox всегда будет иметь свою собственную копию библиотеки CRT и свой собственный менеджер кучи.
Наконец, я думаю, что лучший способ записи в файл, открытый во внешней DLL (для Windows), это создать новую функцию C: fprint_dll (), расположенную в той же DLL, что и та, которая открывает / закрывает файл, и вызывать его из вол.
В основном, чтобы не выполнять операции ввода-вывода с дескриптором файла вне его «родной» dll.
Смотрите также :
Других решений пока нет …