September 21, 2009
have an object that is return from an invoke_method that needs to be put globalling in a dll I am working on.

After declaring a global like this:

object *g_pTradeDesk2a = NULL;


I basically do this:

object g_pTradeDesk2 = oCore.invoke_method<object>(L"CreateTradeDesk",
L"trader");

g_pTradeDesk2.get()->AddRef(); // VERY IMPORTANT!

g_pTradeDesk2a = &g_pTradeDesk2; //assign pointer

However, future references to the g_pTradeDesk2a variable fail with an access violation.

From what I can gather, it seems that the objects returned from invoke_method function hold weak references and deallocate themselves no matter what when they go out of scope.  Is there a good way around this to keep that object allocated?
May 23, 2010
"Duncan McQueen" <dwmcqueen@gmail.com> wrote in message news:h97qib$21og$1@digitalmars.com...
> have an object that is return from an invoke_method that needs to be put globalling in a dll I am working on.
>
> After declaring a global like this:
>
> object *g_pTradeDesk2a = NULL;
>
>
> I basically do this:
>
> object g_pTradeDesk2 = oCore.invoke_method<object>(L"CreateTradeDesk",
> L"trader");
>
> g_pTradeDesk2.get()->AddRef(); // VERY IMPORTANT!
>
> g_pTradeDesk2a = &g_pTradeDesk2; //assign pointer
>
> However, future references to the g_pTradeDesk2a variable fail with an access violation.
>
> From what I can gather, it seems that the objects returned from invoke_method function hold weak references and deallocate themselves no matter what when they go out of scope.  Is there a good way around this to keep that object allocated?

First, sorry for the late reply. It's highly likely this answer's well past being useful to the solution, but at it'll explain the problem

The problem is that you're attempting to hold a pointer to an instance of the *facade*, which has a lifetime limited by the laws of C++. I think what you're trying to do is hold onto the underlying COM object regardless of what happens to the facade instance. This requires a different approach.

btw, holding globals is almost always a bad idea. I'd suggest you find a better way of sharing the trading desk instance.

HTH

Matt