47 void FillCharFromInt(
int nValue,
wchar_t* pBuf,
int nLen )
52 char nSign = (
nValue / ( 1 << ( ( nLen - nInd - 1 ) * 4 ) ) ) % 16;
53 if ( nSign >= 0 && nSign <= 9 )
54 pBuf[nInd] = nSign + L
'0';
56 pBuf[nInd] = nSign - 10 + L
'a';
62 int GetStringFromClassID(
const GUID& guid,
wchar_t* pBuf,
int nLen )
69 FillCharFromInt( guid.Data1, &pBuf[1], 8 );
71 FillCharFromInt( guid.Data2, &pBuf[10], 4 );
73 FillCharFromInt( guid.Data3, &pBuf[15], 4 );
77 for ( nInd = 0; nInd < 2 ; nInd++ )
78 FillCharFromInt( guid.Data4[nInd], &pBuf[20 + 2*nInd], 2 );
80 for ( nInd = 2; nInd < 8 ; nInd++ )
81 FillCharFromInt( guid.Data4[nInd], &pBuf[20 + 1 + 2*nInd], 2 );
87 HRESULT WriteLibraryToRegistry(
const wchar_t* pLibrary, DWORD nLen )
89 HRESULT hRes = E_FAIL;
90 if ( pLibrary && nLen )
97 const wchar_t pSubKeyTemplate[] = L
"Software\\Classes\\CLSID\\.....................................\\InprocHandler32";
98 wchar_t pSubKey[std::size(pSubKeyTemplate)];
99 wcsncpy(pSubKey, pSubKeyTemplate, std::size(pSubKeyTemplate));
101 int nGuidLen = GetStringFromClassID( *
guidList[nInd], &pSubKey[23], 38 );
103 bool bLocalSuccess =
false;
104 if ( nGuidLen == 38 )
106 if ( ERROR_SUCCESS == RegOpenKeyW( HKEY_LOCAL_MACHINE, pSubKey, &hKey ) )
108 if ( ERROR_SUCCESS == RegSetValueExW( hKey, L
"", 0, REG_SZ,
reinterpret_cast<const BYTE*
>(pLibrary), nLen*
sizeof(
wchar_t) ) )
109 bLocalSuccess =
true;
119 if ( !bLocalSuccess )
137class InprocEmbedProvider_Impl :
public IClassFactory,
public InprocCountedObject_Impl
141 explicit InprocEmbedProvider_Impl(
const GUID& guid );
142 virtual ~InprocEmbedProvider_Impl();
145 STDMETHOD(QueryInterface)(REFIID riid,
void ** ppvObj)
override;
146 STDMETHOD_(ULONG, AddRef)()
override;
147 STDMETHOD_(ULONG, Release)()
override;
150 STDMETHOD(CreateInstance)(IUnknown* punkOuter, REFIID riid,
void** ppv)
override;
151 STDMETHOD(LockServer)(
BOOL fLock)
override;
167extern "C" BOOL WINAPI
DllMain( HINSTANCE hInstance, DWORD dwReason, LPVOID )
169 if (dwReason == DLL_PROCESS_ATTACH)
183 if ( !IsEqualIID( riid, IID_IUnknown ) && !IsEqualIID( riid, IID_IClassFactory ) )
184 return E_NOINTERFACE;
186 *ppv =
new inprocserv::InprocEmbedProvider_Impl( rclsid );
187 static_cast<LPUNKNOWN
>(*ppv)->AddRef();
206 HMODULE aCurModule{};
207 GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS
208 | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
212 wchar_t aLibPath[1024];
213 DWORD nLen = GetModuleFileNameW( aCurModule, aLibPath, 1019 );
214 if ( nLen && nLen < 1019 )
216 aLibPath[nLen++] = 0;
217 return WriteLibraryToRegistry( aLibPath, nLen );
227 return WriteLibraryToRegistry( L
"ole32.dll", 10 );
256InprocEmbedProvider_Impl::InprocEmbedProvider_Impl(
const GUID& guid )
263InprocEmbedProvider_Impl::~InprocEmbedProvider_Impl()
269COM_DECLSPEC_NOTHROW STDMETHODIMP InprocEmbedProvider_Impl::QueryInterface( REFIID riid,
void ** ppv )
271 if(IsEqualIID(riid, IID_IUnknown))
274 *ppv =
static_cast<IUnknown*
>(
this);
277 else if (IsEqualIID(riid, IID_IClassFactory))
280 *ppv =
static_cast<IClassFactory*
>(
this);
285 return E_NOINTERFACE;
289COM_DECLSPEC_NOTHROW
STDMETHODIMP_(ULONG) InprocEmbedProvider_Impl::AddRef()
295COM_DECLSPEC_NOTHROW
STDMETHODIMP_(ULONG) InprocEmbedProvider_Impl::Release()
304COM_DECLSPEC_NOTHROW STDMETHODIMP InprocEmbedProvider_Impl::CreateInstance(IUnknown* punkOuter,
305 REFIID riid,
void** ppv)
310 if ( punkOuter !=
nullptr )
311 return CLASS_E_NOAGGREGATION;
313 InprocEmbedDocument_Impl* pEmbedDocument =
new InprocEmbedDocument_Impl(
m_guid );
314 pEmbedDocument->AddRef();
315 HRESULT
hr = pEmbedDocument->QueryInterface( riid, ppv );
316 pEmbedDocument->Release();
318 if ( !SUCCEEDED( hr ) )
325COM_DECLSPEC_NOTHROW STDMETHODIMP InprocEmbedProvider_Impl::LockServer(
BOOL fLock )
InprocCountedObject_Impl()
~InprocCountedObject_Impl()
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID)
STDAPI DllRegisterServer()
STDAPI DllUnregisterServer()
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
static HINSTANCE g_hInstance
static const GUID * guidList[SUPPORTED_FACTORIES_NUM]
#define SUPPORTED_FACTORIES_NUM
const GUID DECLSPEC_SELECTANY OID_PresentationServer
const GUID DECLSPEC_SELECTANY OID_MathServer
const GUID DECLSPEC_SELECTANY OID_DrawingServer
const GUID DECLSPEC_SELECTANY OID_CalcServer
const GUID DECLSPEC_SELECTANY OID_MathOASISServer
const GUID DECLSPEC_SELECTANY OID_WriterTextServer
const GUID DECLSPEC_SELECTANY OID_WriterOASISTextServer
const GUID DECLSPEC_SELECTANY OID_CalcOASISServer
const GUID DECLSPEC_SELECTANY OID_DrawingOASISServer
const GUID DECLSPEC_SELECTANY OID_PresentationOASISServer
STDMETHODIMP_(ULONG) OleWrapperAdviseSink
const wchar_t *typedef BOOL