This interface is used to instantiate a COM Object with a licence key
[ComImport]
[Guid("B196B28F-BAB4-101A-B69C-00AA00341D07")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IClassFactory2
{
/// <summary>
/// the standard create instance (without licence)
/// </summary>
/// <param name="unused">must be set to null</param>
/// <param name="iid">the Guid of the COM class to create</param>
/// <returns>an instance of the COM class</returns>
[return: MarshalAs(UnmanagedType.Interface)]
Object CreateInstance(
[In, MarshalAs(UnmanagedType.Interface)] Object unused,
[In, MarshalAs(UnmanagedType.LPStruct)] Guid iid);
void LockServer(Int32 fLock);
IntPtr GetLicInfo(); // TODO : an enum called LICINFO
[return: MarshalAs(UnmanagedType.BStr)]
String RequestLicKey(
[In, MarshalAs(UnmanagedType.U4)] int reserved);
/// <summary>
/// create an instance of the COM class thanks to a licence key
/// </summary>
/// <param name="pUnkOuter">don't know what it is, set to null</param>
/// <param name="pUnkReserved">must be set to null</param>
/// <param name="iid">the Guid of the COM class to create</param>
/// <param name="bstrKey">the licence key</param>
/// <returns>an instance of the COM class</returns>
[return: MarshalAs(UnmanagedType.Interface)]
Object CreateInstanceLic(
[In, MarshalAs(UnmanagedType.Interface)] object pUnkOuter,
[In, MarshalAs(UnmanagedType.Interface)] object pUnkReserved,
[In, MarshalAs(UnmanagedType.LPStruct)] Guid iid,
[In, MarshalAs(UnmanagedType.BStr)] string bstrKey);
}
<ComImport>
<Guid("B196B28F-BAB4-101A-B69C-00AA00341D07")>
<InterfaceType(ComInterfaceType.InterfaceIsIUnknown)>
Interface IClassFactory2
Function CreateInstance(<MarshalAs(UnmanagedType.[Interface])> unused As Object,
<MarshalAs(UnmanagedType.LPStruct)> iid As Guid) As <MarshalAs(UnmanagedType.[Interface])> Object
Sub LockServer(ByVal fLock As Int32)
Function GetLicInfo() As IntPtr
Function RequestLicKey(<MarshalAs(UnmanagedType.U4)> reserved As Integer) As <MarshalAs(UnmanagedType.BStr)> String
Function CreateInstanceLic(<MarshalAs(UnmanagedType.[Interface])> pUnkOuter As Object,
<MarshalAs(UnmanagedType.[Interface])> pUnkReserved As Object,
<MarshalAs(UnmanagedType.LPStruct)> iid As Guid,
<MarshalAs(UnmanagedType.BStr)> bstrKey As String) As <MarshalAs(UnmanagedType.[Interface])> Object
End Interface
<Flags>
Enum CLSCTX As UInteger
CLSCTX_INPROC_SERVER = &H1
CLSCTX_INPROC_HANDLER = &H2
CLSCTX_LOCAL_SERVER = &H4
CLSCTX_INPROC_SERVER16 = &H8
CLSCTX_REMOTE_SERVER = &H10
CLSCTX_INPROC_HANDLER16 = &H20
CLSCTX_RESERVED1 = &H40
CLSCTX_RESERVED2 = &H80
CLSCTX_RESERVED3 = &H100
CLSCTX_RESERVED4 = &H200
CLSCTX_NO_CODE_DOWNLOAD = &H400
CLSCTX_RESERVED5 = &H800
CLSCTX_NO_CUSTOM_MARSHAL = &H1000
CLSCTX_ENABLE_CODE_DOWNLOAD = &H2000
CLSCTX_NO_FAILURE_LOG = &H4000
CLSCTX_DISABLE_AAA = &H8000
CLSCTX_ENABLE_AAA = &H10000
CLSCTX_FROM_DEFAULT_CONTEXT = &H20000
CLSCTX_INPROC = CLSCTX_INPROC_SERVER Or CLSCTX_INPROC_HANDLER
CLSCTX_SERVER = CLSCTX_INPROC_SERVER Or CLSCTX_LOCAL_SERVER Or CLSCTX_REMOTE_SERVER
CLSCTX_ALL = CLSCTX_SERVER Or CLSCTX_INPROC_HANDLER
End Enum
<DllImport("ole32.dll", CharSet:=CharSet.Unicode, ExactSpelling:=True, PreserveSig:=False)>
Function CoGetClassObject(<MarshalAs(UnmanagedType.LPStruct)> rclsid As Guid,
dwClsContext As CLSCTX,
pServerInfo As IntPtr,
<MarshalAs(UnmanagedType.LPStruct)> riid As Guid) As <MarshalAs(UnmanagedType.[Interface])> Object
End Function
TODO : specify struct to replace all IntPtr
You can instantiate a IClassFactory2 thanks to the CoGetClassObject (from OLE32.DLL)
The "Object" return by methods can be cast to the specified type.
Exemple :
String LicenceKey = "haha";
IClassFactory2 icf2 = Ole32.CoGetClassObject(
typeof(Interop.MyComLibrary.ComMyLibraryClass).GUID,
CLSCTX.CLSCTX_LOCAL_SERVER, new System.IntPtr(),
typeof(IClassFactory2).GUID) as IClassFactory2;
Interop.MyComLibrary.IMyComClass instance = icf2.CreateInstanceLic(
null, null, typeof(Interop.MyComLibrary.IMyComClass).GUID, LicenceKey) as Interop.MyComLibrary.IMyComClass;
Example vb.net :
Dim strLicense As String = "haha"
Dim classFactory As IClassFactory2 = CoGetClassObject(GetType(ComMyLibraryClass).GUID,CLSCTX.CLSCTX_LOCAL_SERVER,
IntPtr.Zero, GetType(IClassFactory2).GUID)
Dim instance As IMyComClass = classFactory.CreateInstanceLic(Nothing, Nothing, GetType(IMyComClass).GUID, strLicense)