001    package org.bridj.cpp.com;
002    
003    import org.bridj.*;
004    import org.bridj.ann.*;
005    import org.bridj.ann.Runtime;
006    import org.bridj.cpp.CPPObject;
007    import org.bridj.cpp.mfc.MFCRuntime;
008    
009    import static org.bridj.cpp.com.COMRuntime.*;
010    
011    @Convention(Convention.Style.StdCall)
012    @IID("00000000-0000-0000-C000-000000000046")
013    @Runtime(COMRuntime.class)
014    public class IUnknown extends CPPObject {
015            protected boolean autoRelease;
016    
017            public static IUnknown wrap(Object object) {
018                    if (object instanceof IUnknown)
019                            return (IUnknown)object;
020                    
021                    return new COMCallableWrapper(object);
022            }
023        @Override
024        protected void finalize() throws Throwable {
025            if (autoRelease)
026                Release();
027            super.finalize();
028        }
029    
030    
031            @Virtual(0)
032            @Deprecated
033            public native int QueryInterface(
034                    Pointer<Byte> riid,
035                    Pointer<Pointer<IUnknown>> ppvObject
036            );
037            
038            public <I extends IUnknown> I QueryInterface(Class<I> type) {
039                    Pointer<Pointer<IUnknown>> p = Pointer.allocatePointer(IUnknown.class);
040                    int ret = QueryInterface(getIID(type), p);
041                    if (ret != S_OK)
042                            return null;
043                    
044                    return p.get().getNativeObject(type);
045            }
046            
047            @Virtual(1)
048            public native int AddRef();
049            
050            @Virtual(2)
051            public native int Release();
052            
053    }