results when I tried the DispEventAdvise.
the IObjectSafetyImpl was included in the class.
Verify that your call to CoInitializeSecurity fails. You
attempt to do that way too late in the game - this should be
done immediately following the very first CoInitialize[Ex]
for the process. Specifically, any in-proc server, like your
ActiveX Control's DLL, cannot set the client security - only
the host application can.
--
=====================================
Alexander Nickolov
Microsoft MVP [VC], MCSD
email: agnickolov@mvps.org
MVP VC FAQ: http://www.mvps.org/vcfaq
=====================================
"DR Bellavance" <DRBellavance@discussions.microsoft.com> wrote in message
news:4483126F-681C-4C91-AAB2-A12BD7491FF0@microsoft.com...
I have an ATL control that uses DCOM to connect to a remote server (also
written in ATL). Both PCs are running XP Pro and I use the VC 6.0 with
ATL
3.0. When my code calls CoCreateInstanceEx, everything connects and I
can
see the server launch on the remote PC. However, when my code calls
pServerSink->DispEventAdvise( <IUnknown pointer> ); I get an error
(0x800706BA). Before I tried changing the access method I was getting
the
error (0x80010114). I am at a quandry as to why I can get the
interface
but
I cannot get the sink interface. When I try to run the server on the
local
machine, I get no errors. Here is my code...
///////////////////////////
// ServerIntfCtrl.h
class ATL_NO_VTABLE CServerIntf :
public CComObjectRootEx<CComSingleThreadModel>,
public IDispatchImpl<IServerIntf, &IID_IServerIntf,
&LIBID_SERVERINTFCTRLLib>,
public CComControl<CServerIntf>,
public IPersistStreamInitImpl<CServerIntf>,
public IOleControlImpl<CServerIntf>,
public IOleObjectImpl<CServerIntf>,
public IOleInPlaceActiveObjectImpl<CServerIntf>,
public IViewObjectExImpl<CServerIntf>,
public IOleInPlaceObjectWindowlessImpl<CServerIntf>,
public IConnectionPointContainerImpl<CServerIntf>,
public IPersistStorageImpl<CServerIntf>,
public ISpecifyPropertyPagesImpl<CServerIntf>,
public IQuickActivateImpl<CServerIntf>,
public IDataObjectImpl<CServerIntf>,
public IProvideClassInfo2Impl<&CLSID_ServerIntf,
&DIID__IServerIntfEvents,
&LIBID_SERVERINTFCTRLLib>,
public IPropertyNotifySinkCP<CServerIntf>,
public CComCoClass<CServerIntf, &CLSID_ServerIntf>,
public IDispatchImpl<ITestIntf, &IID_ITestIntf, &LIBID_TSTCOMSVRLib>,
public CProxy_IServerIntfEvents< CServerIntf >,
public IObjectSafetyImpl<CServerIntf,
INTERFACESAFE_FOR_UNTRUSTED_CALLER>
{
public:
CServerIntf() : m_bInitialized(false), m_blnConnected(false)
{
m_pTstComSvr = NULL;
m_pTstComSvrSink = NULL;
m_strLocation = _T("LOCAL");
m_dwTstComSvr = 0;
}
BOOL m_bInitialized;
BOOL m_blnConnected;
CComBSTR m_strLocation;
CComPtr<ITestIntf> m_pTstComSvr;
CTstComSvrEventSink *m_pTstComSvrSink;
DWORD m_dwTstComSvr;
DECLARE_REGISTRY_RESOURCEID(IDR_SERVERINTF)
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CServerIntf)
COM_INTERFACE_ENTRY(IServerIntf)
//DEL COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(IViewObjectEx)
COM_INTERFACE_ENTRY(IViewObject2)
COM_INTERFACE_ENTRY(IViewObject)
COM_INTERFACE_ENTRY(IOleInPlaceObjectWindowless)
COM_INTERFACE_ENTRY(IOleInPlaceObject)
COM_INTERFACE_ENTRY2(IOleWindow, IOleInPlaceObjectWindowless)
COM_INTERFACE_ENTRY(IOleInPlaceActiveObject)
COM_INTERFACE_ENTRY(IOleControl)
COM_INTERFACE_ENTRY(IOleObject)
COM_INTERFACE_ENTRY(IPersistStreamInit)
COM_INTERFACE_ENTRY2(IPersist, IPersistStreamInit)
COM_INTERFACE_ENTRY(IConnectionPointContainer)
COM_INTERFACE_ENTRY(ISpecifyPropertyPages)
COM_INTERFACE_ENTRY(IQuickActivate)
COM_INTERFACE_ENTRY(IPersistStorage)
COM_INTERFACE_ENTRY(IDataObject)
COM_INTERFACE_ENTRY(IProvideClassInfo)
COM_INTERFACE_ENTRY(IProvideClassInfo2)
COM_INTERFACE_ENTRY2(IDispatch, IServerIntf)
COM_INTERFACE_ENTRY(ITestIntf)
COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer)
END_COM_MAP()
BEGIN_PROP_MAP(CServerIntf)
PROP_DATA_ENTRY("_cx", m_sizeExtent.cx, VT_UI4)
PROP_DATA_ENTRY("_cy", m_sizeExtent.cy, VT_UI4)
// Example entries
// PROP_ENTRY("Property Description", dispid, clsid)
// PROP_PAGE(CLSID_StockColorPage)
END_PROP_MAP()
BEGIN_CONNECTION_POINT_MAP(CServerIntf)
CONNECTION_POINT_ENTRY(IID_IPropertyNotifySink)
CONNECTION_POINT_ENTRY(DIID__IServerIntfEvents)
END_CONNECTION_POINT_MAP()
BEGIN_MSG_MAP(CServerIntf)
CHAIN_MSG_MAP(CComControl<CServerIntf>)
DEFAULT_REFLECTION_HANDLER()
END_MSG_MAP()
// Handler prototypes:
// LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam,
BOOL&
bHandled);
// LRESULT CommandHandler(WORD wNotifyCode, WORD wID, HWND hWndCtl,
BOOL&
bHandled);
// LRESULT NotifyHandler(int idCtrl, LPNMHDR pnmh, BOOL& bHandled);
// IViewObjectEx
DECLARE_VIEW_STATUS(0)
// IServerIntf
public:
STDMETHOD(Connect)(void);
STDMETHOD(Disconnect)(void);
STDMETHOD(get_Location)(/*[out, retval]*/ BSTR *pVal);
STDMETHOD(put_Location)(/*[in]*/ BSTR newVal);
STDMETHOD(LoadBack)(INT intBackCount);
STDMETHOD(LoadPage)(/*[in]*/ BSTR strFileName);
STDMETHOD(Login)(/*[in]*/ BSTR bstrID, /*[in]*/ BSTR bstrPswrd);
STDMETHOD(Logout)(void);
STDMETHOD(LogStatus)(void);
STDMETHOD(PageLoaded)(/*[in]*/ BSTR strFileName);
STDMETHOD(RefreshDisp)(void);
STDMETHOD(RespondTest)(/*[in]*/ BSTR strTestResult);
STDMETHOD(SaveImage)(/*[in]*/ BSTR sFileName);
STDMETHOD(SetAnnotations)(/*[in]*/ BSTR sTLText, /*[in]*/ BSTR sBLText,
/*[in]*/ BSTR sTRText, /*[in]*/ BSTR sBRText);
STDMETHOD(SetMode)(/*[in]*/ BSTR strMode);
STDMETHOD(StartTest)(BSTR strTestName, BSTR strTestID, BSTR
strTestStim,
BSTR strTestExpect, BSTR strTestMode, BSTR strPassURL, BSTR strFailURL,
BSTR
strHaltURL, BSTR strErrURL);
STDMETHOD(StepTest)(void);
STDMETHOD(StopTest)(void);
STDMETHOD(TestRun)(/*[in]*/ BSTR strTestName, /*[in]*/ BSTR strTestID,
/*[in]*/ BSTR strTestStim, /*[in]*/ BSTR strTestExpect, /*[in]*/ BSTR
strTestMode);
HRESULT OnDraw(ATL_DRAWINFO& di)
{
RECT& rc = *(RECT*)di.prcBounds;
Rectangle(di.hdcDraw, rc.left, rc.top, rc.right, rc.bottom);
SetTextAlign(di.hdcDraw, TA_CENTER|TA_BASELINE);
LPCTSTR pszText = _T("ATL 3.0 : ServerIntf");
TextOut(di.hdcDraw,
(rc.left + rc.right) / 2,
(rc.top + rc.bottom) / 2,
pszText,
lstrlen(pszText));
return S_OK;
}
};
/////////////////////////////////////////////////////////////////////////////
// CTstComSvrEventSink
class CTstComSvrEventSink : public IDispEventImpl<10,
CTstComSvrEventSink,
&DIID__ITestIntfEvents, &LIBID_TSTCOMSVRLib, 1, 0>
{
public:
CServerIntf* m_pParent;
CTstComSvrEventSink(CServerIntf* pParent)
{
m_pParent = pParent;
}
void __stdcall OnPageLoad(BSTR strPage)
{
m_pParent->Fire_OnPageLoad(strPage);
}
void __stdcall OnLoadBack(int intPageCount)
{
m_pParent->Fire_OnLoadBack(intPageCount);
}
void __stdcall OnMode(BSTR strMode)
{
m_pParent->Fire_OnMode(strMode);
}
void __stdcall OnProgress(int intValue, int intMaxValue)
{
m_pParent->Fire_OnProgress(intValue, intMaxValue);
}
void __stdcall OnStatus(BSTR strStatus)
{
m_pParent->Fire_OnStatus(strStatus);
}
void __stdcall OnResults(BSTR strResult, BOOL bEnd)
{
m_pParent->Fire_OnResults(strResult, bEnd);
}
void __stdcall OnFinalResult(BSTR strResult)
{
m_pParent->Fire_OnFinalResult(strResult);
}
void __stdcall OnLogin(BOOL blnLoginStatus)
{
m_pParent->Fire_OnLogin(blnLoginStatus);
}
void __stdcall OnImageSave(BOOL bOk)
{
m_pParent->Fire_OnImageSave(bOk);
}
void __stdcall OnServerInit(BSTR strMachine, BSTR strModel)
{
m_pParent->Fire_OnServerInit(strMachine, strModel);
}
BEGIN_SINK_MAP(CTstComSvrEventSink)
SINK_ENTRY_EX(10, DIID__ITestIntfEvents, 0x1, OnPageLoad)
SINK_ENTRY_EX(10, DIID__ITestIntfEvents, 0x2, OnLoadBack)
SINK_ENTRY_EX(10, DIID__ITestIntfEvents, 0x3, OnMode)
SINK_ENTRY_EX(10, DIID__ITestIntfEvents, 0x4, OnProgress)
SINK_ENTRY_EX(10, DIID__ITestIntfEvents, 0x5, OnStatus)
SINK_ENTRY_EX(10, DIID__ITestIntfEvents, 0x6, OnResults)
SINK_ENTRY_EX(10, DIID__ITestIntfEvents, 0x7, OnFinalResult)
SINK_ENTRY_EX(10, DIID__ITestIntfEvents, 0x8, OnLogin)
SINK_ENTRY_EX(10, DIID__ITestIntfEvents, 0x9, OnImageSave)
SINK_ENTRY_EX(10, DIID__ITestIntfEvents, 0xA, OnServerInit)
END_SINK_MAP()
};
///////////////////////////
// ServerIntfCtrl.cpp
STDMETHODIMP CServerIntf::Connect()
{
// TODO: Add your implementation code here
USES_CONVERSION;
HRESULT hr;
int nConnCLSCTX;
if(!m_blnConnected)
{
CLoginDlg Dlg(this);
if(Dlg.DoModal() == IDOK)
{
// Everyone can connect
hr = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_NONE,
RPC_C_IMP_LEVEL_IDENTIFY, NULL, EOAC_NONE, NULL);
COSERVERINFO si;
MULTI_QI qi;
si.dwReserved1 = 0;