Я взял на себя поддержку устаревшего элемента управления 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.
This Сообщение на форуме Microsoft , похоже, указывает на то, что файл символов недоступен для VS2015, и мне интересно, так ли это и для VS2013.До сих пор я не смог найти место для загрузки символов MFC120 для отладки.
Сегодня начните вознаграждение, чтобы найти человека, который сможет объяснить, как и где свойства обычно сериализуются для элементов управления OLE, и какие методы используются для указания места хранения / носителя сериализованных данных.Это вызывает обеспокоенность, поскольку этот элемент управления работает в сетевой среде Citrix ZenDesk в программе Terminal Aware, и если свойства хранятся где-то, тогда каждому клиенту необходимо указать местоположение, уникальное для этого клиента.