Message 1 of 5
GetAttributes from C++
Not applicable
04-11-2008
08:59 AM
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report
Hi,
I have a COM object from an ATL project and I call this object from AutoCAD VBA. I have a problem with the GetAttributes, the variant contain a bad ptr. Anyone have an idea of what I'm doing wrong ? Here is my code, vAttributes contain invalid data.
CErr acadCTSpecExt::LoadAttributesToMap
(
IAcadEntity* in_ipEntity,
CMapStringToString* in_pMapAttributes
)
{
CComQIPtr ipBlockRef(in_ipEntity);
if (ipBlockRef && ipBlockRef->HasAttributes == VARIANT_TRUE)
{
_variant_t vAttributes(ipBlockRef->GetAttributes());
if (vAttributes.parray)
{
LONG lLow, lUp;
CK_HR_TO_ERR(SafeArrayGetLBound(vAttributes.parray, 1, &lLow));
CK_HR_TO_ERR(SafeArrayGetUBound(vAttributes.parray, 1, &lUp));
for (long i=lLow; i<=lUp; ++i)
{
long lIndex = i;
_variant_t vAttribute;
CK_HR_TO_ERR(SafeArrayGetElement(vAttributes.parray, &lIndex, &vAttribute));
IAcadAttributeReferencePtr ipAttributeRef(vAttribute.pdispVal);
if (ipAttributeRef)
{
CComBSTR bsTag, bsValue;
ipAttributeRef->get_TagString(&bsTag);
CString sTag(bsTag);
sTag.MakeUpper();
ipAttributeRef->get_TextString(&bsValue);
CString sValue(bsValue);
sValue.MakeUpper();
in_pMapAttributes->SetAt(sTag, sValue);
}
}
}
}
I have a COM object from an ATL project and I call this object from AutoCAD VBA. I have a problem with the GetAttributes, the variant contain a bad ptr. Anyone have an idea of what I'm doing wrong ? Here is my code, vAttributes contain invalid data.
CErr acadCTSpecExt::LoadAttributesToMap
(
IAcadEntity* in_ipEntity,
CMapStringToString* in_pMapAttributes
)
{
CComQIPtr
if (ipBlockRef && ipBlockRef->HasAttributes == VARIANT_TRUE)
{
_variant_t vAttributes(ipBlockRef->GetAttributes());
if (vAttributes.parray)
{
LONG lLow, lUp;
CK_HR_TO_ERR(SafeArrayGetLBound(vAttributes.parray, 1, &lLow));
CK_HR_TO_ERR(SafeArrayGetUBound(vAttributes.parray, 1, &lUp));
for (long i=lLow; i<=lUp; ++i)
{
long lIndex = i;
_variant_t vAttribute;
CK_HR_TO_ERR(SafeArrayGetElement(vAttributes.parray, &lIndex, &vAttribute));
IAcadAttributeReferencePtr ipAttributeRef(vAttribute.pdispVal);
if (ipAttributeRef)
{
CComBSTR bsTag, bsValue;
ipAttributeRef->get_TagString(&bsTag);
CString sTag(bsTag);
sTag.MakeUpper();
ipAttributeRef->get_TextString(&bsValue);
CString sValue(bsValue);
sValue.MakeUpper();
in_pMapAttributes->SetAt(sTag, sValue);
}
}
}
}