В настоящее время я переношу большой объем кода из приложения на основе MFC в библиотеку DLL для целей брендинга клиента.
Я столкнулся с необычной проблемой. Этот фрагмент кода одинаков в обеих системах:
// ...
CCommsProperties props;
pController->GetProperties( props );
if (props.handshake != HANDSHAKE_RTS_CTS)
{
props.handshake = HANDSHAKE_RTS_CTS;
pController->RefreshCommProperties( props );
}
// ... in another file:
void CControllerSI::RefreshCommProperties ( const CCommsProperties& props )
{
// ... code ...
}
CommProperties - это оболочка для настроек связи, сериализации и т. д., А pController относится к типу ControllerSI, который сам по себе является слоем между фактическими коммуникациями и приложением.
В исходной версии MFC настройка квитирования для RTS-CTS Sticks, но при запуске в качестве версии DLL он сбрасывается на 0, как только функция вводится. Код полностью содержится в разделе кода DLL, поэтому нет никаких границ.
Основные различия между исходным и новым модулями заключаются в том, что переменные, вызывающие различные диалоги, были удалены, а #includes удалены.
Я потерял из-за этого целый день и больше не хочу проигрывать ...
Изначально я закрыл, но не помню, чтобы закрыл его как не по теме. Возможно, это было до того, как они детализировали код закрытия и для всех ранее закрытых вопросов было установлено значение по умолчанию «не по теме».





Трудно увидеть, что не так, только из данного кода. Некоторые общие указатели:
Объект инициализируется и обрабатывается в разных бинарных модулях с несовместимой компоновкой (например, время выполнения C)
Если класс / структура являются общими, они не экспортируются / импортируются правильно.
Класс (ы) определены более чем в одном месте, и вы не включаете правильные определения.
Вышеупомянутые три являются наиболее вероятными причинами, особенно если для всех полей установлены исходные значения по умолчанию.
если это происходит только с одним или двумя полями, структура может быть плохо выровнена, и вам может потребоваться переупорядочить поля, чтобы исправить это (проверьте это и в выпуске).
В общем, я склонен предположить, что объект, который вы инициализировали, не тот, который видит RefreshCommProperties(), по какой-то причине может быть одним из трех вышеупомянутых.
Чтобы действительно понять, что происходит, вам, вероятно, нужно опубликовать исходный код - или, по крайней мере, столько же, чтобы воспроизвести проблему. К сожалению, StackOverflow, похоже, не поощряет это. Вы можете разместить свой код на FTP-сайте или перейти на сайт, позволяющий размещать исходный код (например, CodeGuru).
В UserVoice был пункт о вложениях, но он был отклонен.
Возможно, что CCommsProperties определены в двух разных местах, и каждый файл включает свою собственную версию.
Чтобы проверить эту теорию, в отладчике нужно посмотреть & props.handshake. Если отладчик сообщает вам, что поле имеет разные адреса внутри и вне функции, тогда гипотеза верна, и вы можете перейти к исследованию выходных данных препроцессора, чтобы выяснить, почему это происходит.
После публикации Saratv я решил отказаться от того, что сделал, и снова перезапустить его из рабочего источника.
На этот раз, однако, это работает ... Думаю, я никогда не узнаю, почему передача структуры заставила ее измениться.
Почему этот вопрос был закрыт как "не по теме" ??