120 lines
3.3 KiB
C++
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;
|
|
}
|
|
|