MFC in a Shared DLL, Win98-WinXP

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

fallologia
Сообщения: 20
Зарегистрирован: 22 июл 2005, 12:51

Программа RusCon.exe была скомпилирована на "Microsoft Visual Studio 6" в конфигурации "Release" и опцией "Use MFC in a Shared DLL". Программа без проблем работает под управлением Windows XP и Windows 2000. Под Windows Me и Windows 98 начинается петрушка:
Программа Ruscon вызвала ошибку
RUSCON.EXE
Программа Ruscon будет закрыта.

Если эта ошибка будет повторяться,
попробуйте перезагрузить компьютер.
На Windows Me стоит Microsoft Visual Studio 6. Жму на мессидж-боксе кнопку "Отладка", запускается VS, которая сразу прыгает на строчку кода

Код: Выделить всё

BFF66878 CC                   int         3
с выскакиванием уведомления:
Unhandled exception in rM.exe 0xC0000005: Access Violation
Нажимаю на "ОК" и попадаю на следующую строчку:

Код: Выделить всё

00403C07 85 01                test        dword ptr [ecx],eax
Больше ничего конкретного тут выжать из сведений не могу.
В Windows 98 на том же окошке, мол, "Программа Ruscon вызвала ошибку..." жму на кнопочку "Сведения" и получаю информацию:
Программа RUSCON вызвала сбой при обращении к странице памяти
в модуле RUSCON.EXE по адресу 0177:00403c07.
Регистры:
EAX=000068cc CS=0177 EIP=00403c07 EFLGS=00010206
EBX=0054fca0 SS=017f ESP=0054f74c EBP=0054f7d0
ECX=0053f754 DS=017f ESI=0054f79c FS=3037
EDX=00000003 ES=017f EDI=0054f768 GS=0000
Байты по адресу CS:EIP:
85 01 3d 00 10 00 00 73 ec 2b c8 8b c4 85 01 8b
Содержимое стека:
0054f774 0040159f 0054f7b8 00403fe4 ffffffff 0040339b 0054fca0 0054fca0 5f49cf80 00000001 5f4d1b58 5f4d1b58 00000001 00000000 00000000 00000000
Вот такой салат оливье. Что бы всё это значило, где искать ошибку или сбой программы и как поправлять ситуацию с совместимостью Win98-WinXP, например, при помощи Microsoft Visual Studio .NET 2003?.. Единственное рабочее, до чего я пока додумался, так это использовать опцию "Use MFC in a Static Library" конфигурации "Debug". Получающийся экзешник идёт без всяких проблем на всей линейке Windows от 95 до ХР. Однако и размер экзешника при этом вырастает с 56 Кб до 1500 Кб. Может существует более зкономичный и элегантный путь?.. :roll:
Hawk
Сообщения: 216
Зарегистрирован: 17 фев 2004, 14:52
Откуда: СПб
Контактная информация:

А продебажить дебаговую версию на 98 и Me не пробовал ?
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

BoundsChecker'ом пройдись.

Хотя... Был в моей практике случай: с debug-версией MFC dll все работает как часы, а с релизовской - валится (на NT-платформах ваще в BSOD). И сколько мы не бились, причины так и не поняли. Пришлось в дистрибутив включать debug версию MFC - клиент об этом так и не узнал :) (правда, размер был некритичен).
fallologia
Сообщения: 20
Зарегистрирован: 22 июл 2005, 12:51

Hawk писал(а):А продебажить дебаговую версию на 98 и Me не пробовал ?
VS 6 на Windows Me. Результат
BFF66878 CC int 3
с выскакиванием уведомления:
Unhandled exception in rM.exe 0xC0000005: Access Violation
Нажимаю на "ОК" и попадаю на следующую строчку:
00403C07 85 01 test dword ptr [ecx],eax
, а дальше у меня ни в зуб ногой... :( Пытаюсь хоть как-то соотнести эти строчки со своим программным кодом - не получается... Как это сделать?.. Или нужно установить Microsoft Visual Studio .NET 2003 на Windows 98 и дебажить ею?..
fallologia
Сообщения: 20
Зарегистрирован: 22 июл 2005, 12:51

Eugie писал(а):BoundsChecker'ом пройдись.
А где этот BoundsChecker находится, прости меня дубину неотесанную... :o ops: Да и как им пройтись :?:
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb


Unhandled exception in rM.exe 0xC0000005: Access Violation
А что такое rM.exe и какое отношение имеет к отлаживаемой программе? Это, часом, не резидент какой? Ежели так, закрой его перед отладкой.

По BoundsChecker: удобнейший инструмент для отлова всевозможный ошибок (утечки памяти и др.ресурсов, передача некорректных параметров итд) WinAPI, MFC, COM и др., которые зачастую не ловятся/диагностируются корректно обычными отладчиками. Где взять - не скажу :) , чтобы не нарушать правила сайта. Купить можно например здесь: http://www.softkey.ru/catalog/program.p ... t&compid=1
fallologia
Сообщения: 20
Зарегистрирован: 22 июл 2005, 12:51

Хотя, создавая этот топик, я основывался на данных, полученных при дебагировании одного лишь release-экзешника студией Microsoft Visual Studio 6-ой под Windows Me без остальных файлов проекта, в конце концов вновь прихожу к безысходности первого варианта дебагирования.
Итак. При дебагировании той же студией и под той же системой уже debug-экзешника в среде файлов его проекта, вначале вылазит явная ошибка
error C2664: 'MessageBoxIndirectA' : cannot convert parameter 1 from 'const class CMessageBoxInd *const ' to 'struct tagMSGBOXPARAMSA *'
Conversion loses qualifiers
указывается конкретная строчка
int DoModal() const {return ::MessageBoxIndirect(this);
в контексте определения класса

Код: Выделить всё

class CMessageBoxInd : public MSGBOXPARAMS
{
public:
    CMessageBoxInd(HWND hWnd, LPCTSTR szText, LPCTSTR szCaption, UINT uType = MB_OK|MB_RIGHT|MB_RTLREADING|MB_TOPMOST|MB_USERICON, HINSTANCE hInst = GetModuleHandle(NULL))
    : m_stCaption(szCaption ? szCaption : _T(""))
    , m_stText(szText ? szText : _T(""))
    {
        ZeroMemory(static_cast< MSGBOXPARAMS* >(this), sizeof(MSGBOXPARAMS));
        cbSize = sizeof(MSGBOXPARAMS);
        dwLanguageId = MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL);
        hInstance = hInst;
        hwndOwner = hWnd;
        lpszText = LPCTSTR(m_stText);
        lpszCaption = LPCTSTR(m_stCaption);
        dwStyle = (DWORD)uType;
    }

    int DoModal() const {return ::MessageBoxIndirect(this); }

    void SetIcon( UINT uIcon)
    {
        dwStyle |= MB_USERICON;
        lpszIcon = MAKEINTRESOURCE(uIcon);
    }

private:
    CString m_stCaption,
            m_stText;
};
Что ж, Не зная, как
convert parameter 1 from 'const class CMessageBoxInd *const ' to 'struct tagMSGBOXPARAMSA *
, заменил я этот MessageBoxIndirect на AfxMessageBox, хотя и жалко было лишаться пользовательских иконки и заголовка окошка. Debug-экзешник стал работать без проблем. Release-экзешник тоже компилится без ошибок, но при попытке запустить его на выполнение задачи конвертирования текстового файла опять при дебагировании выпадает та же ошибка, о которой уже говорил в начале топика, а именно строчка
00403C07 85 01 test dword ptr [ecx],eax
fallologia
Сообщения: 20
Зарегистрирован: 22 июл 2005, 12:51

Eugie писал(а):

Unhandled exception in rM.exe 0xC0000005: Access Violation
А что такое rM.exe и какое отношение имеет к отлаживаемой программе? Это, часом, не резидент какой? Ежели так, закрой его перед отладкой.
Да не, я так просто для краткости обозвал один из вариантов своей программы, полученной после компиляции студией, а именно - это релиз-конфигурация со статистической линковкой MFC
fallologia
Сообщения: 20
Зарегистрирован: 22 июл 2005, 12:51

Eugie писал(а): По BoundsChecker: удобнейший инструмент для отлова всевозможный ошибок
Ой, а цена-то, а цена то как кусается!.. Но ничего, спасибо за направление поиска. Русский человек становится большой выдумщик, когда висит груша... Тю, это NuMega, что ли?.. :P
Hawk
Сообщения: 216
Зарегистрирован: 17 фев 2004, 14:52
Откуда: СПб
Контактная информация:

А если debug екзешник запустить в отладчике, что нить появляется ? Ошибки какие-нить лезут ?
Ответить