Files
Work/proto/source/DLLMAIN.CPP
2024-08-07 09:16:27 -04:00

120 lines
3.3 KiB
C++

#include <com/ole2.hpp>
//#include <com/initguid.hpp>
#include <com/message.hpp>
#include <proto/guids.hpp>
#include <proto/dllserve.hpp>
#include <proto/sobj.hpp>
#include <proto/cfactory.hpp>
#include <common/string.hpp>
#include <common/stdio.hpp>
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<IUnknown>(),SmartPointer<DLLServer>(&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;
}