2008-10-02 2 views
0

В настоящее время я переношу много кода из приложения на основе 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 который сам по себе представляет собой слой между фактическим Comms и применением.

На исходной версии MFC настройка рукопожатия на RTS-CTS палочки, но при запуске как версии DLL она сбрасывается до 0, как только функция вводится. Код полностью содержится в разделе DLL кода, поэтому границ нет.

Основные различия между оригиналом и новыми модулями переменным, которые вызывают различные диалоговые окна были удалены и удалены директивы #includes

Я потерял во второй половину дня к этому, и я не хочу потерять больше ...

+0

Почему этот вопрос закрыт как «вне темы»? – augustin 2010-12-09 03:50:09

+0

Я был изначально закрыт, но я не помню, чтобы его закрывали как не по теме. Возможно, это было до того, как они закрыли закрывающий код, и все ранее закрытые вопросы были настроены на дефолт «вне темы». – 2010-12-09 13:17:10

ответ

0

После публикации Saratv я решил сорвать то, что я сделал, и снова перезапустить его из рабочего источника.

На этот раз, однако, это работает ... Думаю, я никогда не узнаю, почему передача структуры заставила ее измениться.

1

Трудно понять, что не так из данного кода. Некоторые общие указатели:

  1. Объект инициализируется и обрабатывается в различных бинарных модулях с несовместимым связыванием (например, С-бегут времена)

  2. Если класс/структура разделяется она не экспортируется/импортируемый правильно.

  3. Класс (ы) определены более чем в одном месте, и вы не включаете правильные определения.

Вышеуказанные три являются наиболее вероятными причинами, особенно если все поля сбрасываются до их инициализированных значений по умолчанию.

Если это происходит только с одним или двумя полями, структура может быть плохо выровнена, и вам может потребоваться изменить поля для их исправления (также проверьте это в выпуске).

В общем, у меня возникает соблазн предположить, что объект, который вы проинтериализировали, не тот, который RefreshCommProperties() видит, по какой-то причине, может быть одним из трех выше.

0

Чтобы понять, что происходит, вам, вероятно, потребуется опубликовать исходный код или, по крайней мере, столько же, чтобы реплицировать проблему. К сожалению, StackOverflow, похоже, не поощряет это. Вы можете опубликовать свой код на FTP-сайте или перейти на сайт, который позволяет размещать исходный код (например, CodeGuru).

0

Возможно, что CCommsProperties определены в двух разных местах, и каждый файл содержит свою собственную версию.

Чтобы проверить эту теорию, в отладчике вам нужно посмотреть & props.handshake. Если отладчик сообщает вам, что в поле есть другой адрес внутри и снаружи функции, тогда гипотеза верна, и вы можете приступить к рассмотрению вывода препроцессора, чтобы выяснить, почему это происходит.