[PyQt] How to write handwritten code to access the C++ object when the corresponding python object destroyed?
Phil Thompson
phil at riverbankcomputing.com
Wed Feb 19 16:24:27 GMT 2020
Have a look at %MethodCode for dtors.
Phil
On 19/02/2020 14:19, Weitian Leung wrote:
> One more question, is it possible to insert handwritten code to the
> MappeedType's release_XXX?
>
> When mapped one type to python's str, which type has it's own alloc
> method
> (The BSTR for example, SysStringAlloc etc). After passed to the C++
> call
> and returned, we need to free the memory using it's own dealloc method.
>
> So is it possible do that? Or other way to call the dealloc method...
>
> On Wednesday, February 19, 2020, Weitian Leung <weitianleung at gmail.com>
> wrote:
>> Thanks, it works!
>>
>> On Wednesday, February 19, 2020, Phil Thompson <
> phil at riverbankcomputing.com> wrote:
>>> On 17/02/2020 14:35, Weitian Leung wrote:
>>>>
>>>> Hi,
>>>> I'm noob in SIP. Say I have two abstract interfaces and one
>>>> method
> to
>>>> create the object:
>>>>
>>>> struct IUnknown /Abstract/
>>>>>
>>>>> {
>>>>> virtual void AddRef() = 0;
>>>>> virtual void Release() = 0;
>>>>>
>>>>> %GCClearCode
>>>>> printf("GCClearCode\n");
>>>>> %End
>>>>> };
>>>>>
>>>>> struct IDemo : public IUnknown /Abstract/
>>>>> {
>>>>> virtual void SayHi() = 0;
>>>>> };
>>>>>
>>>>
>>>> void createDemo(IDemo **demo /Out/);
>>>>>
>>>>
>>>>
>>>> Using in python side:
>>>> idemo = demo.createDemo()
>>>> idemo = None
>>>>
>>>> Is it possible to write some handwritten code that call the Release
> method
>>>> when idemo set to None or when idemo doing GC?
>>>> Or if we can call AddRef automatically when idemo assign to another
> object.
>>>>
>>>> I known that on python side we can call AddRef/Release to make it
>>>> works,
>>>> but I want the code more python's way.
>>>>
>>>> The %GCClearCode handwritten code never called in this case.
>>>> And the %GCTraverseCode handwritten code only call when the object
>>>> make
> an
>>>> assignment to other object.
>>>> Am I missing something?
>>>>
>>>> Please check the full code in the attached file.
>>>
>>>
> https://www.riverbankcomputing.com/static/Docs/sip/c_api.html#event-handlers
>>>
>>> I've only just realised that that documentation is incomplete. The
>>> two
> event types currently implemented are...
>>>
>>> sipEventWrappedInstance, /* After wrapping a C/C++ instance. */
>>> sipEventCollectingWrapper, /* When garbage collecting a wrapper
>>> object.
> */
>>>
>>> ...and the corresponding event handler signatures are...
>>>
>>> typedef void (*sipWrappedInstanceEventHandler)(void *sipCpp);
>>> typedef void (*sipCollectingWrapperEventHandler)(sipSimpleWrapper
> *sipSelf);
>>>
>>> Phil
>>>
More information about the PyQt
mailing list