Как записать в созданный dll файл в Ox?

Я пытаюсь записать с помощью встроенной функции 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?

0

Решение

Наконец то думаю что это невозможно и это вызвано так называемым 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.

Смотрите также :

https://support.microsoft.com/en-us/kb/140584

C Runtime объекты, границы DLL

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]