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 }