связать PageLayoutControl с документом VC++

0 голосов
спросил 19 Апр, 10 от hovik_492000 (220 баллов) в категории Программные продукты Esri
Всем привет.
У меня в проекте код из хелпа. работает на   VB и  C#, а на VC++
ощыбка типа E_POINTER когда вызыбается функция
ipObjectCopy->Overwrite(ipCopiedMap, &ipToOverwriteMap)

    HRESULT hr;
    IObjectCopyPtr ipObjectCopy(CLSID_ObjectCopy);
    IPageLayoutControl2Ptr ipPAgeLayoutControl =  m_PageLayoutControl.get_Object();
    IActiveViewPtr ipActiveView;
    IMapPtr ipMap;
    hr = ipPAgeLayoutControl->get_ActiveView(&ipActiveView);
    hr = ipActiveView->get_FocusMap(&ipMap);
    IUnknownPtr ipToCopyMap = ipMap;
    IUnknownPtr ipCopiedMap;
    hr = ipObjectCopy->Copy(ipToCopyMap, &ipCopiedMap);
    IMapPtr ipMap2 = m_MapControl.get_Map();
    IUnknownPtr ipToOverwriteMap = ipMap2;
    hr = ipObjectCopy->Overwrite(ipCopiedMap, &ipToOverwriteMap);

Может у кого это работает
Спосибо

4 Ответы

0 голосов
ответил 19 Апр, 10 от -3A- (5,220 баллов)
а если попробовать не инициализировать ipToOverwriteMap перед вызовом ipObjectCopy->Overwrite?


<!-- Start Member Post --> HRESULT hr;
IObjectCopyPtr ipObjectCopy(CLSID_ObjectCopy);
IPageLayoutControl2Ptr ipPAgeLayoutControl =  m_PageLayoutControl.get_Object();
IActiveViewPtr ipActiveView;
IMapPtr ipMap;
hr = ipPAgeLayoutControl->get_ActiveView(&ipActiveView);
hr = ipActiveView->get_FocusMap(&ipMap);
IUnknownPtr ipToCopyMap = ipMap;
IUnknownPtr ipCopiedMap;
hr = ipObjectCopy->Copy(ipToCopyMap, &ipCopiedMap);
IMapPtr ipMap2 = m_MapControl.get_Map();
IUnknownPtr ipToOverwriteMap;
hr = ipObjectCopy->Overwrite(ipCopiedMap, &ipToOverwriteMap);

0 голосов
ответил 19 Апр, 10 от hovik_492000 (220 баллов)
Это не будет работать, результат будет то жв самое. К тому же надо как то связать с мапом, непонятно токда куда копируется.
Спосибо са ответ.
0 голосов
ответил 19 Апр, 10 от -3A- (5,220 баллов)
ок, тогда еще одно предположение

не использовать smart-pointer - есть у них проблемы
попробовать так:


HRESULT hr;
IObjectCopyPtr ipObjectCopy(CLSID_ObjectCopy);
IPageLayoutControl2Ptr ipPAgeLayoutControl =  m_PageLayoutControl.get_Object();
IActiveViewPtr ipActiveView;
IMapPtr ipMap;
hr = ipPAgeLayoutControl->get_ActiveView(&ipActiveView);
hr = ipActiveView->get_FocusMap(&ipMap);
IUnknownPtr ipToCopyMap = ipMap;
IUnknownPtr ipCopiedMap;
hr = ipObjectCopy->Copy(ipToCopyMap, &ipCopiedMap);
IMapPtr ipMap2 = m_MapControl.get_Map();
IUnknown* pToOverwriteMap = ipMap2;
hr = ipObjectCopy->Overwrite(ipCopiedMap, &pToOverwriteMap);


как-то так примерно

ну а дальше уже по обстановке - если заработает, то искать в чем грабли с smart-pointer,
если и так не заработает - видимо, баги в ArcGIS
глюков у них тоже хватает

сам я с IObjectCopy не работал, так что это не более чем мои предположения

0 голосов
ответил 19 Апр, 10 от -3A- (5,220 баллов)
вот, вспомнил
_com_ptr_t не рассчитан на такое использование
это аналог auto_ptr из стандартной библиотеки, но для интерфейсов

поэтому, если есть переприсваивание лежащего в _com_ptr_t указателя на интерфейс - лучше использовать обычные указатели (а потом передавать их в _com_ptr_t через метод Attach) или использовать CComPtr / CComQIPtr - они более корректно обходятся с указателями
Добро пожаловать на сайт Вопросов и Ответов, где вы можете задавать вопросы по GIS тематике и получать ответы от других членов сообщества.
...