Повреждение кучи «только для Vista» в приложении MFC - PullRequest
1 голос
/ 27 сентября 2011

Наше приложение MFC, которое ссылается на win32 DLL.Когда приложение вызывает эту функцию DLL, после ввода стека функции аргумент «буфер» становится «плохим указателем».Это приводит к сбою приложения.

static MyClass* Instance(string& buffer);

Я изменил тип аргумента на «char *», но это только приводит к сбою следующего оператора в функции.Как обнаружить это повреждение кучи?

Несколько подсказок

  • Этот сбой воспроизводим, даже если я вызываю эту функцию DLL с самого начала нашего приложения (конструктор CWinApp).Может ли это повреждение памяти быть вызвано загрузкой ресурсов, манифестом и т. Д.?
  • Сбой происходит в Vista и Win7, но не в XP.
  • Оба эти проекта были недавно перенесены из Visual Studio 2002VS2008.

Код, который вызывает функцию

CString data = "some string";
string str = data.GetBuffer();
data.ReleaseBuffer();
MyClass *obj = MyClass::Instance(str);

Ответы [ 2 ]

1 голос
/ 03 октября 2011

Было две ошибки:

  1. Несколько пользовательских файлов C ++ не были скомпилированы с переключателем MD.Нам пришлось добавить -MD в пользовательский скрипт сборки, чтобы сделать CRT-совместимым с другими объектами.

  2. Были конфликты LNK2005 между LIBCMT.LIB и MSVCRT.LIB, которые в противном случае игнорировались из-зак переключателю / FORCE.Мы разрешили эти конфликты, удалив LIBCMT.LIB в Linker-> Input

Спасибо всем за помощь.

0 голосов
/ 27 сентября 2011

Полагаю, это неправильное использование соглашений о вызовах или несоответствие CRT (я иду с соглашениями о вызовах).

Попробуйте создать заглушку DLL с той же сигнатурой функции (которая ничего не делает) и заставить ее работать с вашим приложением MFC.

Вот пример ...

НТН

...