This page is in Pre Alpha. That means no grammer checks, no editting and speeling mistakes galore! The explanations and the final version will come soon . Check it out at your own risk! a.bat cl.exe /c minimal.cpp link.exe /dll /def:minimal.def /out:minimal.dll minimal.obj b.bat del z.txt c:\msdev\samples\atl\minimal\mindriv\mindriv a1.bat cl.exe /D _CONSOLE /c mindriv.cpp link.exe kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 mindriv.obj first.cpp #include CComModule _Module; #include #include void abc(char *p){FILE *fp=fopen("c:\\msdev\\samples\\atl\\minimal\\z.txt","a+");fprintf(fp,"%s\n",p);fclose(fp);} STDMETHODIMP CComClassFactory::CreateInstance(LPUNKNOWN pUnkOuter,REFIID riid, void** ppvObj) { abc("CComClassFactory::CreateInstance"); m_pfnCreateInstance(pUnkOuter, riid, ppvObj); return 0; } STDMETHODIMP CComClassFactory::LockServer(BOOL fLock){ return S_OK;} ATLAPI AtlInternalQueryInterface(void* pThis, const _ATL_INTMAP_ENTRY* pEntries, REFIID iid, void** ppvObject) { abc("AtlInternalQueryInterface"); *ppvObject = (IUnknown*)((int)pThis+pEntries->dw); return S_OK; } #include DEFINE_GUID(IID_IMinObj,0xA4E6EAE8, 0xE19A, 0x11CF, 0x92, 0x03, 0x00, 0xA0, 0xC9, 0x03, 0x97, 0x6F); DEFINE_GUID(CLSID_CMinObj,0xA4E6EAEC, 0xE19A, 0x11CF, 0x92, 0x03, 0x00, 0xA0, 0xC9, 0x03, 0x97, 0x6F); interface IMinObj : public IUnknown { public: STDMETHOD(Hello)() = 0 ; }; class CMinObj:public IMinObj,public CComObjectRoot, public CComCoClass { public: BEGIN_COM_MAP(CMinObj) COM_INTERFACE_ENTRY(IMinObj) END_COM_MAP() DECLARE_NO_REGISTRY() public: STDMETHOD(Hello)() { abc("Hello"); return S_OK; } }; BEGIN_OBJECT_MAP(ObjectMap) OBJECT_ENTRY(CLSID_CMinObj, CMinObj) END_OBJECT_MAP() extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID) { if (dwReason == DLL_PROCESS_ATTACH) _Module.Init(ObjectMap,hInstance); return TRUE; } STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) { return _Module.GetClassObject(rclsid, riid, ppv); } ATLAPI AtlModuleInit(_ATL_MODULE* pM, _ATL_OBJMAP_ENTRY* p, HINSTANCE h) { abc("AtlModuleInit"); pM->m_pObjMap = p; pM->m_hInst = pM->m_hInstTypeLib = pM->m_hInstResource = h; return S_OK; } ATLAPI AtlModuleGetClassObject(_ATL_MODULE* pM, REFCLSID rclsid, REFIID riid, LPVOID* ppv) { abc("AtlModuleGetClassObject"); _ATL_OBJMAP_ENTRY* pEntry = pM->m_pObjMap; pEntry->pfnGetClassObject(pEntry->pfnCreateInstance,IID_IUnknown,(LPVOID*)&pEntry->pCF); pEntry->pCF->QueryInterface(riid, ppv); return 0; } mindriv.cpp #include #include #include #include #include DEFINE_GUID(IID_IMinObj,0xA4E6EAE8, 0xE19A, 0x11CF, 0x92, 0x03, 0x00, 0xA0, 0xC9, 0x03, 0x97, 0x6F); DEFINE_GUID(CLSID_CMinObj,0xA4E6EAEC, 0xE19A, 0x11CF, 0x92, 0x03, 0x00, 0xA0, 0xC9, 0x03, 0x97, 0x6F); interface IMinObj : public IUnknown { public: virtual void _stdcall Hello() = 0 ; }; int main( int argc, char *argv[ ]) { CoInitialize(NULL); IUnknown* pUnk;IMinObj* pMin; CoCreateInstance(CLSID_CMinObj,0,CLSCTX_INPROC_SERVER,IID_IUnknown,(void**)&pUnk); pUnk->QueryInterface(IID_IMinObj, (LPVOID*)&pMin); pMin->Hello(); } minimal.reg REGEDIT HKEY_CLASSES_ROOT\Minimal.MinObj = MinObj Class HKEY_CLASSES_ROOT\Minimal.MinObj\CLSID = {A4E6EAEC-E19A-11CF-9203-00A0C903976F} HKEY_CLASSES_ROOT\Minimal.MinObj.1 = MinObj Class HKEY_CLASSES_ROOT\Minimal.MinObj.1\CLSID = {A4E6EAEC-E19A-11CF-9203-00A0C903976F} HKEY_CLASSES_ROOT\CLSID\{A4E6EAEC-E19A-11CF-9203-00A0C903976F} = MinObj Class HKEY_CLASSES_ROOT\CLSID\{A4E6EAEC-E19A-11CF-9203-00A0C903976F}\InprocServer32 = c:\msdev\samples\atl\minimal\minimal.dll HKEY_CLASSES_ROOT\CLSID\{A4E6EAEC-E19A-11CF-9203-00A0C903976F}\ProgID = Minimal.MinObj.1 HKEY_CLASSES_ROOT\CLSID\{A4E6EAEC-E19A-11CF-9203-00A0C903976F}\VersionIndependentProgID = Minimal.MinObj second.cpp #include CComModule _Module; #include #include #include DEFINE_GUID(IID_IMinObj,0xA4E6EAE8, 0xE19A, 0x11CF, 0x92, 0x03, 0x00, 0xA0, 0xC9, 0x03, 0x97, 0x6F); DEFINE_GUID(CLSID_CMinObj,0xA4E6EAEC, 0xE19A, 0x11CF, 0x92, 0x03, 0x00, 0xA0, 0xC9, 0x03, 0x97, 0x6F); interface IMinObj : public IUnknown { public: STDMETHOD(Hello)() = 0 ; }; class CMinObj:public IMinObj,public CComObjectRoot, public CComCoClass { public: BEGIN_COM_MAP(CMinObj) COM_INTERFACE_ENTRY(IMinObj) END_COM_MAP() DECLARE_NO_REGISTRY() public: STDMETHOD(Hello)() { MessageBox(0,"bye","hii",0); return S_OK; } }; BEGIN_OBJECT_MAP(ObjectMap) OBJECT_ENTRY(CLSID_CMinObj, CMinObj) END_OBJECT_MAP() extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID) { if (dwReason == DLL_PROCESS_ATTACH) _Module.Init(ObjectMap, hInstance); return TRUE; } STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) { return _Module.GetClassObject(rclsid, riid, ppv); }