GetLink / Crash when deleting object

On 12/05/2013 at 12:32, xxxxxxxx wrote:

User Information:
Cinema 4D Version:   r14 
Platform:      
Language(s) :     C++  ;

---------
Hi, I am facing a problem which I dont understand..
this is my code to get a linked object:

ipCustomObject = bc->GetLink(IP_CUSTOM_OBJECT,doc);
if (!ipCustomObject) return FALSE;
...

I was thinking that this prevents further problems when the linked object is removed by the user, but it doesnt. Can anyone point out whats wrong?

later on in the code i use the linked object to create an instance. everything works well until the user deletes the object.

  
innerPillar = BaseObject::Alloc(Oinstance);
innerPillar->SetParameter(DescID(INSTANCEOBJECT_LINK),GeData(ipCustomObject),DESCFLAGS_SET_0);
innerPillar->InsertUnder(main);

cheers,
Ello

On 12/05/2013 at 16:55, xxxxxxxx wrote:

I would simply get the linked object at those points where you need to use it instead of storing it as a class member and hoping for the best.  If the user deletes the object or clears the link, you will get a NULL for GetLink() when you do need to use it and thereby avoid the crashes by using the condition at that point.  Also, you can use GetObjectLink() to avoid casting.

On 13/05/2013 at 00:12, xxxxxxxx wrote:

thank you, Robert. now it works.. but what about performance as it looks a bit strange like this now:

if (bc->GetObjectLink(IP_CUSTOM_OBJECT,doc)) {
innerPillar = BaseObject::Alloc(Oinstance);
innerPillar->SetParameter(DescID(INSTANCEOBJECT_LINK),GeData(ToPoly((PolygonObject* )(bc->GetObjectLink(IP_CUSTOM_OBJECT,doc)))),DESCFLAGS_SET_0);
innerPillar = ((BaseObject* )ToPoly((PolygonObject* )(bc->GetObjectLink(IP_CUSTOM_OBJECT,doc))))->GetRad();
...

maybe i need to get the parameters at another stage? now i am doing it like this:

Bool myPlugin::Message(GeListNode *node, LONG type, void *t_data)
{
	if (type==MSG_DESCRIPTION_VALIDATE || type==MSG_FILTER)
	{
		BaseObject *op = (BaseObject* )node;
		readParameters(op);
	}
	return TRUE;
}

On 13/05/2013 at 05:29, xxxxxxxx wrote:

Do it like this:

PolygonObject* ipCustomObject =    ToPoly(bc->GetObjectLink(IP_CUSTOM_OBJECT,doc));  
if (!(ipCustomObject && ipCustomObject->IsInstanceOf(Opolygon)))    return FALSE;  
innerPillar = BaseObject::Alloc(Oinstance);  
if (!innerPillar) return FALSE;  
innerPillar->SetParameter(DescID(INSTANCEOBJECT_LINK),GeData(ipCustomObject),DESCFLAGS_SET_0);  
innerPillar = ipCustomObject->GetRad(); // ????

Not sure what you are doing in the last line.

On 13/05/2013 at 09:20, xxxxxxxx wrote:

thank you for your help :)