Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

221 lines
4.7 KiB

// ConnMgr.cpp : Implementation of WinMain
// Note: Proxy/Stub Information
// To build a separate proxy/stub DLL,
// run nmake -f ConnMgrps.mk in the project directory.
#include "stdafx.h"
#include "resource.h"
#include "initguid.h"
#include "Connection.h"
#include "ConnMgr.h"
#include "ConnMgr_i.c"
#include "ConnectionManager.h"
class CConnApp : public CWinApp
{
public:
virtual BOOL InitInstance();
virtual int ExitInstance();
BOOL InitCOMSecurity();
};
CConnApp theApp;
LONG CExeModule::Unlock()
{
LONG l = CComModule::Unlock();
if (l == 0)
{
#if _WIN32_WINNT >= 0x0400
if (CoSuspendClassObjects() == S_OK)
PostThreadMessage(dwThreadID, WM_QUIT, 0, 0);
#else
PostThreadMessage(dwThreadID, WM_QUIT, 0, 0);
#endif
}
return l;
}
HRESULT CExeModule::UpdateRegistry(LPCOLESTR lpszRes, BOOL bRegister)
{
USES_CONVERSION;
CComPtr<IRegistrar> p;
HRESULT hRes = CoCreateInstance(CLSID_Registrar, NULL,
CLSCTX_INPROC_SERVER,
IID_IRegistrar, (void**)&p);
if (FAILED(hRes))
{
AfxMessageBox(_T("Failed to create ATL Registrar! Try updated version of ATL.DLL."));
return hRes;
}
_ATL_MODULE* pM = this;
TCHAR szModule[_MAX_PATH];
GetModuleFileName(pM->m_hInst, szModule, _MAX_PATH);
p->AddReplacement(OLESTR("Module"), T2OLE(szModule));
LPCOLESTR szType = OLESTR("REGISTRY");
GetModuleFileName(pM->m_hInstResource, szModule, _MAX_PATH);
LPOLESTR pszModule = T2OLE(szModule);
#ifdef SAVE
if (HIWORD(lpszRes)==0)
{
if (bRegister)
hRes = p->ResourceRegister(pszModule, ((UINT)LOWORD((DWORD)lpszRes)), szType);
else
hRes = p->ResourceUnregister(pszModule, ((UINT)LOWORD((DWORD)lpszRes)), szType);
}
else
{
#endif
if (bRegister)
hRes = p->ResourceRegisterSz(pszModule, lpszRes, szType);
else
hRes = p->ResourceUnregisterSz(pszModule, lpszRes, szType);
#ifdef SAVE
}
#endif
return hRes;
}
CExeModule _Module;
BEGIN_OBJECT_MAP(ObjectMap)
OBJECT_ENTRY(CLSID_ConnectionManager, CConnectionManager)
END_OBJECT_MAP()
LPCTSTR FindOneOf(LPCTSTR p1, LPCTSTR p2)
{
while (*p1 != NULL)
{
LPCTSTR p = p2;
while (*p != NULL)
{
if (*p1 == *p++)
return p1+1;
}
p1++;
}
return NULL;
}
BOOL CConnApp::InitCOMSecurity()
{
HRESULT hRes = CoInitializeSecurity(NULL, -1, NULL, NULL,
RPC_C_AUTHN_LEVEL_CONNECT,
RPC_C_IMP_LEVEL_IMPERSONATE,
NULL,
EOAC_NONE,
NULL);
if (FAILED(hRes))
return false;
return true;
}
BOOL CConnApp::InitInstance()
{
// CG: The following block was added by the Windows Sockets component.
{
if (!AfxSocketInit())
{
AfxMessageBox(CG_IDS_SOCKETS_INIT_FAILED);
return FALSE;
}
}
// Initialize OLE libraries
HRESULT hr = CoInitializeEx(NULL,COINIT_MULTITHREADED);
if (FAILED(hr))
{
AfxMessageBox(_T("OLE Initialization Failed!"));
return FALSE;
}
// Initialize COM Security
if (!InitCOMSecurity())
{
AfxMessageBox(_T("Security Initialization Failed!"));
return FALSE;
}
// Initialize the ATL Module
_Module.Init(ObjectMap,m_hInstance);
_Module.dwThreadID = GetCurrentThreadId();
#ifdef _AFXDLL
Enable3dControls(); // Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic();
#endif
// Check command line arguments
TCHAR szTokens[] = _T("-/");
BOOL bRun = TRUE;
LPCTSTR lpszToken = FindOneOf(m_lpCmdLine, szTokens);
while (lpszToken != NULL)
{
// Register ATL/MFC class factories
if (lstrcmpi(lpszToken, _T("Embedding")) == 0 ||
lstrcmpi(lpszToken, _T("Automation")) == 0)
{
AfxOleSetUserCtrl(FALSE);
break;
}
else if (lstrcmpi(lpszToken, _T("UnregServer")) == 0)
{
_Module.UpdateRegistryFromResource(IDR_ConnMgr, FALSE);
// _Module.UpdateRegistry((LPCOLESTR)MAKEINTRESOURCE(IDR_CONNECTIONMANAGER), false);
_Module.UpdateRegistry(_T("connectionmanager.rgs"), false);
bRun = FALSE;
break;
}
else if (lstrcmpi(lpszToken, _T("RegServer")) == 0)
{
_Module.UpdateRegistryFromResource(IDR_ConnMgr, TRUE);
// _Module.UpdateRegistry((LPCOLESTR)MAKEINTRESOURCE(IDR_CONNECTIONMANAGER), true);
_Module.UpdateRegistry(_T("connectionmanager.rgs"), true);
COleObjectFactory::UpdateRegistryAll();
bRun = FALSE;
break;
}
lpszToken = FindOneOf(lpszToken, szTokens);
}
if (bRun)
{
_Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER,REGCLS_MULTIPLEUSE);
COleObjectFactory::RegisterAll();
}
return TRUE;
}
int CConnApp::ExitInstance()
{
CoUninitialize();
// MFC's class factories registration is
// automatically revoked by MFC itself
_Module.RevokeClassObjects();
// Revoke class factories for ATL
_Module.Term();
// cleanup ATL Global Module
CoUninitialize();
return CWinApp::ExitInstance();
}