Initial
This commit is contained in:
119
proto/source/DLLMAIN.CPP
Normal file
119
proto/source/DLLMAIN.CPP
Normal file
@@ -0,0 +1,119 @@
|
||||
#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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user