Неустранимая ошибка при использовании FILE * в Windows из DLL - PullRequest
1 голос
/ 07 мая 2010

Недавно я обнаружил проблему с компилятором Visual C ++ 2008, но с помощью незначительного взлома избегайте ее. В настоящее время я не могу использовать тот же хак, но проблема существует как в 2008 году, так и в 2010 (Express).

Итак, я подготовил для вас 2 простых файла C: один для DLL, другой для программы:

DLL (file-dll.c):

#include <stdio.h>

__declspec(dllexport) void
print_to_stream (FILE *stream)
{
  fprintf (stream, "OK!\n");
}

И для программы, которая связывает эту DLL через файл-dll.lib:

Программа:

#include <stdio.h>

__declspec(dllimport) void print_to_stream (FILE *stream);

int
main (void)
{
  print_to_stream (stdout);
  return 0;
}

Чтобы скомпилировать и связать DLL:

cl /LD file-dll.c

Для компиляции и компоновки программы:

cl file-test.c file-dll.lib

При вызове file-test.exe я получил фатальную ошибку (похожую на ошибку сегментации в UNIX).

Как я уже говорил ранее, у меня была та же проблема: перед передачей указателя FILE * в DLL. Я думал, что это может быть из-за несоответствия компилятора, но теперь я использую один компилятор для всего, и это не проблема. ; - (* 1 021 *

Что мне теперь делать?

1024 * * UPD 1026 * *: Я нашел решение: cl /LD /MD file-dll.c cl /MD file-test.c file-dll.lib Ключ заключается в том, чтобы связываться с динамической библиотекой, но (я не знал этого) по умолчанию она связывает статически, и (следовательно) возникает ошибка (я понимаю почему). P.S. Спасибо за терпение.

1 Ответ

4 голосов
/ 07 мая 2010

Потенциальные ошибки при прохождении объектов CRT через границы DLL

Здесь приведен конкретный пример вашей ситуации.В зависимости от того, как вы компилируете свою DLL и программу, у вас могут быть отдельные копии CRT, что приведет к нарушению доступа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...