286 lines
9.6 KiB
C++
286 lines
9.6 KiB
C++
#include <mdcommon.hxx>
|
||
|
||
// {BA4E57F0-FAB6-11cf-9D1A-00AA00A70D51}
|
||
//DEFINE_GUID(CLSID_MDCOM, 0xba4e57f0, 0xfab6, 0x11cf, 0x9d, 0x1a, 0x0, 0xaa, 0x0, 0xa7, 0xd, 0x51);
|
||
// {BA4E57F1-FAB6-11cf-9D1A-00AA00A70D51}
|
||
//static const GUID IID_IMDCOMSRVFACTORY =
|
||
//{ 0xba4e57f1, 0xfab6, 0x11cf, { 0x9d, 0x1a, 0x0, 0xaa, 0x0, 0xa7, 0xd, 0x51 } };
|
||
|
||
// {C1AA48C0-FACC-11cf-9D1A-00AA00A70D51}
|
||
//static const GUID IID_IMDCOM =
|
||
//{ 0xc1aa48c0, 0xfacc, 0x11cf, { 0x9d, 0x1a, 0x0, 0xaa, 0x0, 0xa7, 0xd, 0x51 } };
|
||
|
||
CMDCOMSrvFactory::CMDCOMSrvFactory()
|
||
:m_mdcObject()
|
||
{
|
||
m_dwRefCount=0;
|
||
//
|
||
// Addref object, so refcount doesn't go to 0 if all clients release.
|
||
//
|
||
m_mdcObject.AddRef();
|
||
}
|
||
|
||
CMDCOMSrvFactory::~CMDCOMSrvFactory()
|
||
{
|
||
m_mdcObject.Release();
|
||
}
|
||
HRESULT
|
||
CMDCOMSrvFactory::CreateInstance(IUnknown *pUnkOuter, REFIID riid, void ** ppObject)
|
||
{
|
||
if (pUnkOuter != NULL) {
|
||
return CLASS_E_NOAGGREGATION;
|
||
}
|
||
if (FAILED(m_mdcObject.QueryInterface(riid, ppObject))) {
|
||
return E_NOINTERFACE;
|
||
}
|
||
return NO_ERROR;
|
||
}
|
||
|
||
HRESULT
|
||
CMDCOMSrvFactory::LockServer(BOOL fLock)
|
||
{
|
||
if (fLock) {
|
||
InterlockedIncrement((long *)&g_dwRefCount);
|
||
}
|
||
else {
|
||
InterlockedDecrement((long *)&g_dwRefCount);
|
||
}
|
||
return NO_ERROR;
|
||
}
|
||
|
||
HRESULT
|
||
CMDCOMSrvFactory::QueryInterface(REFIID riid, void **ppObject)
|
||
{
|
||
if (riid==IID_IUnknown || riid == IID_IClassFactory) {
|
||
if (SUCCEEDED(m_mdcObject.GetConstructorError())) {
|
||
*ppObject = (IClassFactory *) this;
|
||
}
|
||
else {
|
||
return m_mdcObject.GetConstructorError();
|
||
}
|
||
}
|
||
else {
|
||
return E_NOINTERFACE;
|
||
}
|
||
AddRef();
|
||
return NO_ERROR;
|
||
}
|
||
|
||
ULONG
|
||
CMDCOMSrvFactory::AddRef()
|
||
{
|
||
DWORD dwRefCount;
|
||
dwRefCount = InterlockedIncrement((long *)&m_dwRefCount);
|
||
return dwRefCount;
|
||
}
|
||
|
||
ULONG
|
||
CMDCOMSrvFactory::Release()
|
||
{
|
||
DWORD dwRefCount;
|
||
dwRefCount = InterlockedDecrement((long *)&m_dwRefCount);
|
||
//
|
||
// There must only be one copy of this. So keep the first one around regardless.
|
||
//
|
||
// if (dwRefCount == 0) {
|
||
// delete this;
|
||
// }
|
||
return dwRefCount;
|
||
}
|
||
|
||
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, void** ppObject)
|
||
{
|
||
if ((rclsid != CLSID_MDCOM) &&
|
||
(rclsid != CLSID_MDCOMEXE)) {
|
||
return CLASS_E_CLASSNOTAVAILABLE;
|
||
}
|
||
|
||
if (FAILED(g_pFactory->QueryInterface(riid, ppObject))) {
|
||
*ppObject = NULL;
|
||
return E_INVALIDARG;
|
||
}
|
||
return NO_ERROR;
|
||
}
|
||
|
||
HRESULT _stdcall DllCanUnloadNow() {
|
||
if (g_dwRefCount) {
|
||
return S_FALSE;
|
||
}
|
||
else {
|
||
return S_OK;
|
||
}
|
||
}
|
||
|
||
STDAPI DllRegisterServer(void)
|
||
{
|
||
HKEY hKeyCLSID, hKeyInproc32;
|
||
DWORD dwDisposition;
|
||
HMODULE hModule;
|
||
DWORD dwReturn = ERROR_SUCCESS;
|
||
|
||
dwReturn = RegCreateKeyEx(HKEY_CLASSES_ROOT,
|
||
TEXT("CLSID\\{BA4E57F0-FAB6-11cf-9D1A-00AA00A70D51}"),
|
||
NULL,
|
||
TEXT(""),
|
||
REG_OPTION_NON_VOLATILE,
|
||
KEY_ALL_ACCESS,
|
||
NULL,
|
||
&hKeyCLSID,
|
||
&dwDisposition);
|
||
if (dwReturn == ERROR_SUCCESS) {
|
||
dwReturn = RegSetValueEx(hKeyCLSID,
|
||
TEXT(""),
|
||
NULL,
|
||
REG_SZ,
|
||
(BYTE*) TEXT("MD COM Server"),
|
||
sizeof(TEXT("MD COM Server")));
|
||
if (dwReturn == ERROR_SUCCESS) {
|
||
dwReturn = RegCreateKeyEx(hKeyCLSID,
|
||
"InprocServer32",
|
||
NULL, TEXT(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
|
||
&hKeyInproc32, &dwDisposition);
|
||
|
||
if (dwReturn == ERROR_SUCCESS) {
|
||
hModule=GetModuleHandle(TEXT("METADATA.DLL"));
|
||
if (!hModule) {
|
||
dwReturn = GetLastError();
|
||
}
|
||
else {
|
||
TCHAR szName[MAX_PATH+1];
|
||
if (GetModuleFileName(hModule,
|
||
szName,
|
||
sizeof(szName)) == NULL) {
|
||
dwReturn = GetLastError();
|
||
}
|
||
else {
|
||
dwReturn = RegSetValueEx(hKeyInproc32,
|
||
TEXT(""),
|
||
NULL,
|
||
REG_SZ,
|
||
(BYTE*) szName,
|
||
sizeof(TCHAR)*(lstrlen(szName)+1));
|
||
if (dwReturn == ERROR_SUCCESS) {
|
||
dwReturn = RegSetValueEx(hKeyInproc32,
|
||
TEXT("ThreadingModel"),
|
||
NULL,
|
||
REG_SZ,
|
||
(BYTE*) TEXT("Both"),
|
||
sizeof(TEXT("Both")));
|
||
}
|
||
}
|
||
}
|
||
RegCloseKey(hKeyInproc32);
|
||
}
|
||
}
|
||
RegCloseKey(hKeyCLSID);
|
||
}
|
||
|
||
if( dwReturn == ERROR_SUCCESS )
|
||
{
|
||
dwReturn = RegCreateKeyEx(HKEY_CLASSES_ROOT,
|
||
TEXT("CLSID\\{8ad3dcf8-869e-4c0e-89c2-86d7710610aa}"),
|
||
NULL,
|
||
TEXT(""),
|
||
REG_OPTION_NON_VOLATILE,
|
||
KEY_ALL_ACCESS,
|
||
NULL,
|
||
&hKeyCLSID,
|
||
&dwDisposition);
|
||
if (dwReturn == ERROR_SUCCESS) {
|
||
dwReturn = RegSetValueEx(hKeyCLSID,
|
||
TEXT(""),
|
||
NULL,
|
||
REG_SZ,
|
||
(BYTE*) TEXT("MD COM2 Server"),
|
||
sizeof(TEXT("MD COM2 Server")));
|
||
if (dwReturn == ERROR_SUCCESS) {
|
||
dwReturn = RegCreateKeyEx(hKeyCLSID,
|
||
"InprocServer32",
|
||
NULL, TEXT(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
|
||
&hKeyInproc32, &dwDisposition);
|
||
|
||
if (dwReturn == ERROR_SUCCESS) {
|
||
hModule=GetModuleHandle(TEXT("METADATA.DLL"));
|
||
if (!hModule) {
|
||
dwReturn = GetLastError();
|
||
}
|
||
else {
|
||
TCHAR szName[MAX_PATH+1];
|
||
if (GetModuleFileName(hModule,
|
||
szName,
|
||
sizeof(szName)) == NULL) {
|
||
dwReturn = GetLastError();
|
||
}
|
||
else {
|
||
dwReturn = RegSetValueEx(hKeyInproc32,
|
||
TEXT(""),
|
||
NULL,
|
||
REG_SZ,
|
||
(BYTE*) szName,
|
||
sizeof(TCHAR)*(lstrlen(szName)+1));
|
||
if (dwReturn == ERROR_SUCCESS) {
|
||
dwReturn = RegSetValueEx(hKeyInproc32,
|
||
TEXT("ThreadingModel"),
|
||
NULL,
|
||
REG_SZ,
|
||
(BYTE*) TEXT("Both"),
|
||
sizeof(TEXT("Both")));
|
||
}
|
||
}
|
||
}
|
||
RegCloseKey(hKeyInproc32);
|
||
}
|
||
}
|
||
RegCloseKey(hKeyCLSID);
|
||
}
|
||
}
|
||
|
||
return RETURNCODETOHRESULT(dwReturn);
|
||
}
|
||
|
||
STDAPI DllUnregisterServer(void)
|
||
{
|
||
DWORD dwReturn = ERROR_SUCCESS;
|
||
|
||
#if 0
|
||
if ( IISGetPlatformType() != PtWindows95 ) {
|
||
|
||
//
|
||
// Delete Crypto Keys
|
||
//
|
||
|
||
HRESULT hres;
|
||
hres = IISCryptoInitialize();
|
||
|
||
if (SUCCEEDED(hres)) {
|
||
|
||
IISCryptoDeleteStandardContainer(0);
|
||
|
||
IISCryptoDeleteStandardContainer(CRYPT_MACHINE_KEYSET);
|
||
|
||
IISCryptoTerminate();
|
||
|
||
}
|
||
}
|
||
#endif
|
||
|
||
dwReturn = RegDeleteKey(HKEY_CLASSES_ROOT,
|
||
TEXT("CLSID\\{BA4E57F0-FAB6-11cf-9D1A-00AA00A70D51}\\InprocServer32"));
|
||
if (dwReturn == ERROR_SUCCESS) {
|
||
dwReturn = RegDeleteKey(HKEY_CLASSES_ROOT,
|
||
TEXT("CLSID\\{BA4E57F0-FAB6-11cf-9D1A-00AA00A70D51}"));
|
||
}
|
||
|
||
if( dwReturn == ERROR_SUCCESS )
|
||
{
|
||
dwReturn = RegDeleteKey(HKEY_CLASSES_ROOT,
|
||
TEXT("CLSID\\{8ad3dcf8-869e-4c0e-89c2-86d7710610aa}\\InprocServer32"));
|
||
if (dwReturn == ERROR_SUCCESS) {
|
||
dwReturn = RegDeleteKey(HKEY_CLASSES_ROOT,
|
||
TEXT("CLSID\\{8ad3dcf8-869e-4c0e-89c2-86d7710610aa}"));
|
||
}
|
||
}
|
||
|
||
return RETURNCODETOHRESULT(dwReturn);
|
||
}
|
||
|