001    package org.bridj.cpp.com;
002    
003    import org.bridj.Pointer;
004    
005    import org.bridj.ann.Convention;
006    import org.bridj.ann.Virtual;
007    import org.bridj.ann.Convention.Style;
008    
009    import org.bridj.*;
010    import org.bridj.ann.*;
011    import org.bridj.ann.Runtime;
012    import static org.bridj.cpp.com.COMRuntime.*;
013    
014    @IID("00000001-0000-0000-C000-000000000046")
015    public class IClassFactory extends IUnknown
016    {
017            @Virtual(0) // TODO handle in runtime not as zero but as count of parents' virtual methods + 0
018            @Deprecated
019            public native int CreateInstance( 
020                    Pointer<IUnknown> pUnkOuter,
021                    Pointer<Byte> riid,
022                    Pointer<Pointer<IUnknown>> ppvObject
023            );
024            
025            public <I extends IUnknown> I CreateInstance(Class<I> type) {
026                    Pointer<Pointer<IUnknown>> p = Pointer.allocatePointer(IUnknown.class);
027                    int ret = CreateInstance(null, getIID(type), p);
028                    if (ret != S_OK)
029                            return null;
030                    
031                    return p.get().getNativeObject(type);
032            }
033            
034            @Virtual(1)
035            public native int LockServer(boolean fLock);
036    }