Где MFC COleControl :: DoPropExchange хранит постоянные свойства? - PullRequest
0 голосов
/ 12 июня 2018

Я взял на себя поддержку устаревшего элемента управления MFC OCX в C ++.Проект сейчас в VS2013.Я пытаюсь понять функционирование метода DoPropExchange.Этот метод вызывает PX _ ????? (member) для почти всех элементов данных в элементе управления где ????это тип (Bool, Short, Long ...) Насколько я понимаю, они призваны обеспечить постоянное хранение свойств.Но из моего понимания работы элемента управления OCX нет постоянных свойств.Есть ли какая-либо другая причина для вызова PX _ ????для всех элементов данных в DoPropExchange, кроме как для поддержки постоянных свойств?Я также пытаюсь понять, где эти постоянные свойства загружаются / хранятся.Где указан сериализованный файл для загрузки / хранения постоянных значений свойств?

Вот источник DoPropExchange

// CSigPlusCtrl::DoPropExchange - Persistence support
void CSigPlusCtrl::DoPropExchange(CPropExchange* pPX)
{
    DWORD Version;
    long BaudRate;
    short ComPort;
    BOOL Rv;

    LOG(("DoPropExchange Entry"));

    ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
    COleControl::DoPropExchange(pPX);
    Version = pPX->GetVersion();

    if (pPX->IsLoading())
    {
        LoadDefaultProperties();
        LoadIniParameters();
    }

    if ((Version & 0xFFFF0000) == (DWORD)MAKELONG(0, _wVerMajor))
    {
        Rv = PX_Short(pPX, _T("ImageFileFormat"), ImageFileFormat, 0);
        Rv = PX_Short(pPX, _T("ImageXSize"), ImageXSize, 0);
        Rv = PX_Short(pPX, _T("ImageYSize"), ImageYSize, 0);
        Rv = PX_Short(pPX, _T("ImagePenWidth"), ImagePenWidth, 1);
   . . .
        Rv = PX_Short(pPX, _T("ZoomY"), ZoomY, 0);
        Rv = PX_Short(pPX, _T("ZoomPower"), ZoomPower, 1);

        if (pPX->IsLoading())
        {
            if (SigBlob != NULL)
            {
                GlobalFree(SigBlob);
                SigBlob = NULL;
            }
        }
        else
        {
            if (SigBlob == NULL)
            {
                SigBlobType* SigBlobPtr;

                SigBlob = GlobalAlloc(GMEM_MOVEABLE, sizeof(DWORD));
                SigBlobPtr = (SigBlobType*)GlobalLock(SigBlob);
                SigBlobPtr->Size = 0;
                GlobalUnlock(SigBlob);
            }
        }

        if ((Version & 0xFFFF) == Version223)
        {
            Rv = PX_Blob(pPX, _T("SigBlob"), SigBlob, NULL);
        }
        if ((Version & 0xFFFF) >= Version224)
        {
            CString SigStr;

            if (!pPX->IsLoading())
            {
                SigStr = BlobToString();
            }
            Rv = PX_String(pPX, _T("SigStringStored"), SigStr, _T(""));
            if (pPX->IsLoading())
            {
                BlobFromString(SigStr);
            }
        }

    }
    else
    {
        SigMessageBox("Warning Incompatable Versions of SigPlus Control");
    }
    LoadTabletParameters();
    LOG(("DoPropExchange Exit"));
}

РЕДАКТИРОВАТЬ Добавлено 6-21-2018

Запуск вОтладчик, который я наблюдаю, когда вызывается DoPropExchange, VS2013 показывает стек с сообщением, что приведенные ниже кадры стека могут быть неправильными.И один кадр чуть выше, который вызывает DoPropExchange, взят из mfc120d.dll, у которого нет доступного файла символов mfc120d.i386.pdb.
enter image description here

This Сообщение на форуме Microsoft , похоже, указывает на то, что файл символов недоступен для VS2015, и мне интересно, так ли это и для VS2013.До сих пор я не смог найти место для загрузки символов MFC120 для отладки.

Сегодня начните вознаграждение, чтобы найти человека, который сможет объяснить, как и где свойства обычно сериализуются для элементов управления OLE, и какие методы используются для указания места хранения / носителя сериализованных данных.Это вызывает обеспокоенность, поскольку этот элемент управления работает в сетевой среде Citrix ZenDesk в программе Terminal Aware, и если свойства хранятся где-то, тогда каждому клиенту необходимо указать местоположение, уникальное для этого клиента.

1 Ответ

0 голосов
/ 29 июля 2018

DoPropExchange используется для реализации постоянства атрибутов управления, главным образом между проектированием и временем выполнения.Фактический приемник передается клиентом OCX.

В VC настройки хранятся в файле RC, а в VB - в файлах frm и frx.Если вы откроете FRM в блокноте, вы, вероятно, увидите раздел со свойствами этого элемента управления.Как примечание, есть аналогичная реализация в случае, если элемент управления используется в HTML со встроенными настройками в самом html.

Если ваши VB-клиенты не сохраняют настройки внешне через прямые вызовы функции Property bag, это не так.скорее всего, у вас возникла проблема, поскольку указанные выше свойства не сохраняются во время выполнения.

...