#include //#include #include #include #include #include #include #include #include BOOL unicodeOk(void); DLLServer comDLLServer; BOOL WINAPI DLLMain(HINSTANCE hDLLInst,DWORD dwReason,LPVOID lpReserved) { switch(dwReason) { case DLL_PROCESS_ATTACH : if(unicodeOk())comDLLServer.dllInst(hDLLInst); break; case DLL_PROCESS_DETACH : break; case DLL_THREAD_ATTACH : break; case DLL_THREAD_DETACH : break; default : break; } return TRUE; } BOOL unicodeOk(void) { DWORD strReturnLength(String::MaxString); BOOL retCode(TRUE); String strUserName; strUserName.reserve(String::MaxString); if(!::GetUserName(strUserName,&strReturnLength))retCode=ERROR_CALL_NOT_IMPLEMENTED==::GetLastError()?FALSE:TRUE; return retCode; } STDAPI DllGetClassObject(REFCLSID rclsid,REFIID riid,PPVOID ppv) { HRESULT hr(CLASS_E_CLASSNOTAVAILABLE); IUnknown *pIUnknown=0; Message::message("DllGetClassObject"); if(CLSID_SimpleObject==rclsid) { hr=E_OUTOFMEMORY; pIUnknown=::new CFSimpleObject(SmartPointer(),SmartPointer(&comDLLServer)); } else Message::message(Message::makeID(rclsid)+String(" is not supported")); if(NULL==pIUnknown)return hr; comDLLServer.addObject(); hr=pIUnknown->QueryInterface(riid,ppv); if(FAILED(hr)) { comDLLServer.removeObject(); delete pIUnknown; } if(FAILED(hr))Message::message("FAILED!!"); return hr; } STDAPI DllCanUnloadNow(void) { return (!comDLLServer.objects()&&!comDLLServer.locks())?S_OK:S_FALSE; } STDAPI DllRegisterServer(void) { Message::message("DllRegisterServer"); #if 0 HRESULT hr = NOERROR; TCHAR szID[GUID_SIZE+1]; TCHAR szCLSID[GUID_SIZE+32]; TCHAR szModulePath[MAX_PATH]; // Obtain the path to this module's executable file for later use. GetModuleFileName(g_pServer->m_hDllInst,szModulePath,sizeof(szModulePath)/sizeof(TCHAR)); /*------------------------------------------------------------------------- Create registry entries for the DllCar Component. -------------------------------------------------------------------------*/ // Create some base key strings. StringFromGUID2(CLSID_DllCar, szID, GUID_SIZE); lstrcpy(szCLSID, TEXT("CLSID\\")); lstrcat(szCLSID, szID); // Create ProgID keys. SetRegKeyValue(TEXT("CTS.DllCar.1"),NULL,TEXT("DllCar Component - DLLSERVE Code Sample")); SetRegKeyValue(TEXT("CTS.DllCar.1"),TEXT("CLSID"),szID); // Create VersionIndependentProgID keys. SetRegKeyValue(TEXT("CTS.DllCar"),NULL,TEXT("DllCar Component - DLLSERVE Code Sample")); SetRegKeyValue(TEXT("CTS.DllCar"),TEXT("CurVer"),TEXT("CTS.DllCar.1")); SetRegKeyValue(TEXT("CTS.DllCar"),TEXT("CLSID"),szID); // Create entries under CLSID. SetRegKeyValue(szCLSID,NULL,TEXT("DllCar Component - DLLSERVE Code Sample")); SetRegKeyValue(szCLSID,TEXT("ProgID"),TEXT("CTS.DllCar.1")); SetRegKeyValue(szCLSID,TEXT("VersionIndependentProgID"),TEXT("CTS.DllCar")); SetRegKeyValue(szCLSID,TEXT("NotInsertable"),NULL); SetRegKeyValue(szCLSID,TEXT("InprocServer32"),szModulePath); #endif return S_OK; } STDAPI DllUnregisterServer(void) { Message::message("DllUnregisterServer"); return S_OK; }