转自http://www.cnblogs.com/zdxster/archive/2011/01/27/1945868.html
在EOS6的项目中,如果采用VC++开发的ActiveX,那么第一次运行的时候,IE中就会提示,“在此页上的ActiveX控件和本页上的其他部分的交互可能不安全,你想允许这种交互吗?”在网上找了很多资料,原理介绍的多,但是真正如何做,介绍的比较少,因此这里把实际的步骤一步一步的记录下来了,供大家参考。
1.1 去除ActiveX访问时的安全提示
当ActiveX第一次被访问时,会出现如下提示框:
这是IE浏览器的安全机制造成的,我们可以采用下面的步骤来去除这个提示信息:
1.1.1 在CDemoCtl的头文件.h中增加对objsave的引用
#include <objsafe.h>
1.1.2 在其protected声明区增加如下内容:
1
//去掉安全警告 BEGIN
2![](/Images/OutliningIndicators/None.gif)
3
DECLARE_INTERFACE_MAP()
4![](/Images/OutliningIndicators/None.gif)
5
BEGIN_INTERFACE_PART(ObjectSafety, IObjectSafety)
6![](/Images/OutliningIndicators/None.gif)
7
STDMETHOD(GetInterfaceSafetyOptions)(REFIID riid, DWORD __RPC_FAR *pdwSupportedOptions, DWORD __RPC_FAR *pdwEnabledOptions);
8![](/Images/OutliningIndicators/None.gif)
9
STDMETHOD(SetInterfaceSafetyOptions)(REFIID riid, DWORD dwOptionSetMask, DWORD dwEnabledOptions);
10![](/Images/OutliningIndicators/None.gif)
11
END_INTERFACE_PART(ObjectSafety)
12![](/Images/OutliningIndicators/None.gif)
13
//去掉安全警告 END
1.1.3 在CDemoCtl的实现类.cpp的IMPLEMENT_DYNCREATE(CActivexFirstCtrl, COleControl)这一行后增加如下内容:
1
//去掉安全警告 BEGIN
2
BEGIN_INTERFACE_MAP(CAudioCommunicationCtrl, COleControl)
3![](/Images/OutliningIndicators/None.gif)
4
INTERFACE_PART(CAudioCommunicationCtrl, IID_IObjectSafety, ObjectSafety)
5![](/Images/OutliningIndicators/None.gif)
6
END_INTERFACE_MAP()
7![](/Images/OutliningIndicators/None.gif)
8
// Implementation of IObjectSafety
9![](/Images/OutliningIndicators/None.gif)
10
STDMETHODIMP CAudioCommunicationCtrl::XObjectSafety::GetInterfaceSafetyOptions(
11![](/Images/OutliningIndicators/None.gif)
12
REFIID riid,
13![](/Images/OutliningIndicators/None.gif)
14
DWORD __RPC_FAR *pdwSupportedOptions,
15![](/Images/OutliningIndicators/None.gif)
16
DWORD __RPC_FAR *pdwEnabledOptions)
17![](/Images/OutliningIndicators/None.gif)
18![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
19![](/Images/OutliningIndicators/InBlock.gif)
20
METHOD_PROLOGUE_EX(CAudioCommunicationCtrl, ObjectSafety)
21![](/Images/OutliningIndicators/InBlock.gif)
22
if (!pdwSupportedOptions || !pdwEnabledOptions)
23![](/Images/OutliningIndicators/InBlock.gif)
24![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
25![](/Images/OutliningIndicators/InBlock.gif)
26
return E_POINTER;
27![](/Images/OutliningIndicators/InBlock.gif)
28
}
29![](/Images/OutliningIndicators/InBlock.gif)
30
*pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA;
31![](/Images/OutliningIndicators/InBlock.gif)
32
*pdwEnabledOptions = 0;
33![](/Images/OutliningIndicators/InBlock.gif)
34
if (NULL == pThis->GetInterface(&riid))
35![](/Images/OutliningIndicators/InBlock.gif)
36![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
37![](/Images/OutliningIndicators/InBlock.gif)
38
TRACE("Requested interface is not supported.\n");
39![](/Images/OutliningIndicators/InBlock.gif)
40
return E_NOINTERFACE;
41![](/Images/OutliningIndicators/InBlock.gif)
42
}
43![](/Images/OutliningIndicators/InBlock.gif)
44
// What interface is being checked out anyhow?
45![](/Images/OutliningIndicators/InBlock.gif)
46
OLECHAR szGUID[39];
47![](/Images/OutliningIndicators/InBlock.gif)
48
int i = StringFromGUID2(riid, szGUID, 39);
49![](/Images/OutliningIndicators/InBlock.gif)
50
if (riid == IID_IDispatch)
51![](/Images/OutliningIndicators/InBlock.gif)
52![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
53![](/Images/OutliningIndicators/InBlock.gif)
54
// Client wants to know if object is safe for scripting
55![](/Images/OutliningIndicators/InBlock.gif)
56
*pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER;
57![](/Images/OutliningIndicators/InBlock.gif)
58
return S_OK;
59![](/Images/OutliningIndicators/InBlock.gif)
60
}
61![](/Images/OutliningIndicators/InBlock.gif)
62
else if (riid == IID_IPersistPropertyBag
63![](/Images/OutliningIndicators/InBlock.gif)
64
|| riid == IID_IPersistStreamInit
65![](/Images/OutliningIndicators/InBlock.gif)
66
|| riid == IID_IPersistStorage
67![](/Images/OutliningIndicators/InBlock.gif)
68
|| riid == IID_IPersistMemory)
69![](/Images/OutliningIndicators/InBlock.gif)
70![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
71![](/Images/OutliningIndicators/InBlock.gif)
72
// Those are the persistence interfaces COleControl derived controls support
73![](/Images/OutliningIndicators/InBlock.gif)
74
// as indicated in AFXCTL.H
75![](/Images/OutliningIndicators/InBlock.gif)
76
// Client wants to know if object is safe for initializing from persistent data
77![](/Images/OutliningIndicators/InBlock.gif)
78
*pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA;
79![](/Images/OutliningIndicators/InBlock.gif)
80
return S_OK;
81![](/Images/OutliningIndicators/InBlock.gif)
82
}
83![](/Images/OutliningIndicators/InBlock.gif)
84
else
85![](/Images/OutliningIndicators/InBlock.gif)
86![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
87![](/Images/OutliningIndicators/InBlock.gif)
88
// Find out what interface this is, and decide what options to enable
89![](/Images/OutliningIndicators/InBlock.gif)
90
TRACE("We didn't account for the safety of this interface, and it's one we support
\n");
91![](/Images/OutliningIndicators/InBlock.gif)
92
return E_NOINTERFACE;
93![](/Images/OutliningIndicators/InBlock.gif)
94
}
95![](/Images/OutliningIndicators/InBlock.gif)
96
}
97![](/Images/OutliningIndicators/None.gif)
98
STDMETHODIMP CAudioCommunicationCtrl::XObjectSafety::SetInterfaceSafetyOptions(
99![](/Images/OutliningIndicators/None.gif)
100
REFIID riid,
101![](/Images/OutliningIndicators/None.gif)
102
DWORD dwOptionSetMask,
103![](/Images/OutliningIndicators/None.gif)
104
DWORD dwEnabledOptions)
105![](/Images/OutliningIndicators/None.gif)
106![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
107![](/Images/OutliningIndicators/InBlock.gif)
108
METHOD_PROLOGUE_EX(CAudioCommunicationCtrl, ObjectSafety)
109![](/Images/OutliningIndicators/InBlock.gif)
110
OLECHAR szGUID[39];
111![](/Images/OutliningIndicators/InBlock.gif)
112
// What is this interface anyway?
113![](/Images/OutliningIndicators/InBlock.gif)
114
// We can do a quick lookup in the registry under HKEY_CLASSES_ROOT\Interface
115![](/Images/OutliningIndicators/InBlock.gif)
116
int i = StringFromGUID2(riid, szGUID, 39);
117![](/Images/OutliningIndicators/InBlock.gif)
118
if (0 == dwOptionSetMask && 0 == dwEnabledOptions)
119![](/Images/OutliningIndicators/InBlock.gif)
120![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
121![](/Images/OutliningIndicators/InBlock.gif)
122
// the control certainly supports NO requests through the specified interface
123![](/Images/OutliningIndicators/InBlock.gif)
124
// so it"s safe to return S_OK even if the interface isn"t supported.
125![](/Images/OutliningIndicators/InBlock.gif)
126
return S_OK;
127![](/Images/OutliningIndicators/InBlock.gif)
128
}
129![](/Images/OutliningIndicators/InBlock.gif)
130
// Do we support the specified interface?
131![](/Images/OutliningIndicators/InBlock.gif)
132
if (NULL == pThis->GetInterface(&riid))
133![](/Images/OutliningIndicators/InBlock.gif)
134![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
135![](/Images/OutliningIndicators/InBlock.gif)
136
TRACE1("%s is not support.\n", szGUID);
137![](/Images/OutliningIndicators/InBlock.gif)
138
return E_FAIL;
139![](/Images/OutliningIndicators/InBlock.gif)
140
}
141![](/Images/OutliningIndicators/InBlock.gif)
142
if (riid == IID_IDispatch)
143![](/Images/OutliningIndicators/InBlock.gif)
144![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
145![](/Images/OutliningIndicators/InBlock.gif)
146
TRACE("Client asking if it's safe to call through IDispatch.\n");
147![](/Images/OutliningIndicators/InBlock.gif)
148
TRACE("In other words, is the control safe for scripting?\n");
149![](/Images/OutliningIndicators/InBlock.gif)
150
if (INTERFACESAFE_FOR_UNTRUSTED_CALLER == dwOptionSetMask && INTERFACESAFE_FOR_UNTRUSTED_CALLER == dwEnabledOptions)
151![](/Images/OutliningIndicators/InBlock.gif)
152![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
153![](/Images/OutliningIndicators/InBlock.gif)
154
return S_OK;
155![](/Images/OutliningIndicators/InBlock.gif)
156
}
157![](/Images/OutliningIndicators/InBlock.gif)
158
else
159![](/Images/OutliningIndicators/InBlock.gif)
160![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
161![](/Images/OutliningIndicators/InBlock.gif)
162
return E_FAIL;
163![](/Images/OutliningIndicators/InBlock.gif)
164
}
165![](/Images/OutliningIndicators/InBlock.gif)
166
}
167![](/Images/OutliningIndicators/InBlock.gif)
168
else if (riid == IID_IPersistPropertyBag
169![](/Images/OutliningIndicators/InBlock.gif)
170
|| riid == IID_IPersistStreamInit
171![](/Images/OutliningIndicators/InBlock.gif)
172
|| riid == IID_IPersistStorage
173![](/Images/OutliningIndicators/InBlock.gif)
174
|| riid == IID_IPersistMemory)
175![](/Images/OutliningIndicators/InBlock.gif)
176![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
177![](/Images/OutliningIndicators/InBlock.gif)
178
TRACE("Client asking if it's safe to call through IPersist*.\n");
179![](/Images/OutliningIndicators/InBlock.gif)
180
TRACE("In other words, is the control safe for initializing from persistent data?\n");
181![](/Images/OutliningIndicators/InBlock.gif)
182
if (INTERFACESAFE_FOR_UNTRUSTED_DATA == dwOptionSetMask && INTERFACESAFE_FOR_UNTRUSTED_DATA == dwEnabledOptions)
183![](/Images/OutliningIndicators/InBlock.gif)
184![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
185![](/Images/OutliningIndicators/InBlock.gif)
186
return NOERROR;
187![](/Images/OutliningIndicators/InBlock.gif)
188
}
189![](/Images/OutliningIndicators/InBlock.gif)
190
else
191![](/Images/OutliningIndicators/InBlock.gif)
192![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
193![](/Images/OutliningIndicators/InBlock.gif)
194
return E_FAIL;
195![](/Images/OutliningIndicators/InBlock.gif)
196
}
197![](/Images/OutliningIndicators/InBlock.gif)
198
}
199![](/Images/OutliningIndicators/InBlock.gif)
200
else
201![](/Images/OutliningIndicators/InBlock.gif)
202![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
203![](/Images/OutliningIndicators/InBlock.gif)
204
TRACE1("We didn"t account for the safety of %s, and it"s one we support
\n", szGUID);
205![](/Images/OutliningIndicators/InBlock.gif)
206
return E_FAIL;
207![](/Images/OutliningIndicators/InBlock.gif)
208
}
209![](/Images/OutliningIndicators/InBlock.gif)
210
}
211![](/Images/OutliningIndicators/None.gif)
212
STDMETHODIMP_(ULONG) CAudioCommunicationCtrl::XObjectSafety::AddRef()
213![](/Images/OutliningIndicators/None.gif)
214![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
215![](/Images/OutliningIndicators/InBlock.gif)
216
METHOD_PROLOGUE_EX_(CAudioCommunicationCtrl, ObjectSafety)
217![](/Images/OutliningIndicators/InBlock.gif)
218
return (ULONG)pThis->ExternalAddRef();
219![](/Images/OutliningIndicators/InBlock.gif)
220
}
221![](/Images/OutliningIndicators/None.gif)
222
STDMETHODIMP_(ULONG) CAudioCommunicationCtrl::XObjectSafety::Release()
223![](/Images/OutliningIndicators/None.gif)
224![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
225![](/Images/OutliningIndicators/InBlock.gif)
226
METHOD_PROLOGUE_EX_(CAudioCommunicationCtrl, ObjectSafety)
227![](/Images/OutliningIndicators/InBlock.gif)
228
return (ULONG)pThis->ExternalRelease();
229![](/Images/OutliningIndicators/InBlock.gif)
230
}
231![](/Images/OutliningIndicators/None.gif)
232
STDMETHODIMP CAudioCommunicationCtrl::XObjectSafety::QueryInterface(
233![](/Images/OutliningIndicators/None.gif)
234
REFIID iid, LPVOID* ppvObj)
235![](/Images/OutliningIndicators/None.gif)
236![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
237![](/Images/OutliningIndicators/InBlock.gif)
238
METHOD_PROLOGUE_EX_(CAudioCommunicationCtrl, ObjectSafety)
239![](/Images/OutliningIndicators/InBlock.gif)
240
return (HRESULT)pThis->ExternalQueryInterface(&iid, ppvObj);
241![](/Images/OutliningIndicators/InBlock.gif)
242
}
243![](/Images/OutliningIndicators/None.gif)
244
//去掉安全警告 END