为什么我打包的ActiveX一用网址打开就不运行,本地打开就能运行?

Alfred 2005-11-25 03:12:28
...全文
178 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Alfred 2005-11-25
  • 打赏
  • 举报
回复
Implements IObjectSafety

Private Sub IObjectSafety_GetInterfaceSafetyOptions(ByVal riid As _
Long, pdwSupportedOptions As Long, pdwEnabledOptions As Long)

Dim Rc As Long
Dim rClsId As udtGUID
Dim IID As String
Dim bIID() As Byte

pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER Or _
INTERFACESAFE_FOR_UNTRUSTED_DATA

If (riid <> 0) Then
CopyMemory rClsId, ByVal riid, Len(rClsId)

bIID = String$(MAX_GUIDLEN, 0)
Rc = StringFromGUID2(rClsId, VarPtr(bIID(0)), MAX_GUIDLEN)
Rc = InStr(1, bIID, vbNullChar) - 1
IID = Left$(UCase(bIID), Rc)

Select Case IID
Case IID_IDispatch
pdwEnabledOptions = IIf(m_fSafeForScripting, _
INTERFACESAFE_FOR_UNTRUSTED_CALLER, 0)
Exit Sub
Case IID_IPersistStorage, IID_IPersistStream, _
IID_IPersistPropertyBag
pdwEnabledOptions = IIf(m_fSafeForInitializing, _
INTERFACESAFE_FOR_UNTRUSTED_DATA, 0)
Exit Sub
Case Else
Err.Raise E_NOINTERFACE
Exit Sub
End Select
End If
End Sub

Private Sub IObjectSafety_SetInterfaceSafetyOptions(ByVal riid As _
Long, ByVal dwOptionsSetMask As Long, ByVal dwEnabledOptions As Long)
Dim Rc As Long
Dim rClsId As udtGUID
Dim IID As String
Dim bIID() As Byte

If (riid <> 0) Then
CopyMemory rClsId, ByVal riid, Len(rClsId)

bIID = String$(MAX_GUIDLEN, 0)
Rc = StringFromGUID2(rClsId, VarPtr(bIID(0)), MAX_GUIDLEN)
Rc = InStr(1, bIID, vbNullChar) - 1
IID = Left$(UCase(bIID), Rc)

Select Case IID
Case IID_IDispatch
If ((dwEnabledOptions And dwOptionsSetMask) <> _
INTERFACESAFE_FOR_UNTRUSTED_CALLER) Then
Err.Raise E_FAIL
Exit Sub
Else
If Not m_fSafeForScripting Then
Err.Raise E_FAIL
End If
Exit Sub
End If

Case IID_IPersistStorage, IID_IPersistStream, _
IID_IPersistPropertyBag
If ((dwEnabledOptions And dwOptionsSetMask) <> _
INTERFACESAFE_FOR_UNTRUSTED_DATA) Then
Err.Raise E_FAIL
Exit Sub
Else
If Not m_fSafeForInitializing Then
Err.Raise E_FAIL
End If
Exit Sub
End If

Case Else
Err.Raise E_NOINTERFACE
Exit Sub
End Select
End If
End Sub

Private Sub cmdTest_Click()
MsgBox "Test"
End Sub
是这样吗?
显示Implements IObjectSafety这个用户定义类型未定义
Alfred 2005-11-25
  • 打赏
  • 举报
回复
打开控件代码窗口,在声明部分加入如下代码(如果有OptionExplicit语句,当然要保证代码放在其后):
这句是:我打开控件代码窗口里面显示的是这个
Private Sub cmdTest_Click()
MsgBox "Test"
End Sub
是这个窗口吗?在这个下面写吗?
Alfred 2005-11-25
  • 打赏
  • 举报
回复
MKTYPLIB
我的机器没有这个命令
weiweiplay 2005-11-25
  • 打赏
  • 举报
回复
把下列内容拷贝到“记事本”中,然后保存到上述文件夹,文件名为Objsafe.odl:


[
uuid(C67830E0-D11D-11cf-BD80-00AA00575603),
helpstring("VBIObjectSafetyInterface"),
version(1.0)
]
libraryIObjectSafetyTLB
{
importlib("stdole2.tlb");
[
uuid(CB5BDC81-93C1-11cf-8F20-00805F2CD064),
helpstring("IObjectSafetyInterface"),
odl
]
interfaceIObjectSafety:IUnknown{
[helpstring("GetInterfaceSafetyOptions")]
HRESULTGetInterfaceSafetyOptions(
[in] long riid,
[in] long*pdwSupportedOptions,
[in] long*pdwEnabledOptions);

[helpstring("SetInterfaceSafetyOptions")]
HRESULTSetInterfaceSafetyOptions(
[in] long riid,
[in] long dwOptionsSetMask,
[in] long dwEnabledOptions);
}
}
在命令行提示符下切换到项目文件夹,输入下列命令创建一个.tlb文件:


MKTYPLIBobjsafe.odl/tlbobjsafe.tlb
在VB中新建一个ActiveXControl项目。修改属性,把项目命名为IobjSafety,控件命名为DemoCtl。在控件上放置一个按钮,命名为cmdTest,在它的Click事件中加入一句代码MsgBox"Test"。


打开菜单“工程->引用”,点“浏览”,找到刚刚建立的Objsafe.tlb,把它加入到引用中。


增加一个新module名为basSafeCtl,并在其中加入下列代码:


OptionExplicit

PublicConstIID_IDispatch="{00020400-0000-0000-C000-000000000046}"
PublicConstIID_IPersistStorage=_
"{0000010A-0000-0000-C000-000000000046}"
PublicConstIID_IPersistStream=_
"{00000109-0000-0000-C000-000000000046}"
PublicConstIID_IPersistPropertyBag=_
"{37D84F60-42CB-11CE-8135-00AA004BB851}"

PublicConstINTERFACESAFE_FOR_UNTRUSTED_CALLER=&H1
PublicConstINTERFACESAFE_FOR_UNTRUSTED_DATA=&H2
PublicConstE_NOINTERFACE=&H80004002
PublicConstE_FAIL=&H80004005
PublicConstMAX_GUIDLEN=40

PublicDeclareSubCopyMemoryLib"kernel32"Alias"RtlMoveMemory"_
(pDestAsAny,pSourceAsAny,ByValByteLenAsLong)
PublicDeclareFunctionStringFromGUID2Lib"ole32.dll"(rguidAs_
Any,ByVallpstrClsIdAsLong,ByValcbMaxAsInteger)AsLong

PublicTypeudtGUID
Data1AsLong
Data2AsInteger
Data3AsInteger
Data4(7)AsByte
EndType

Publicm_fSafeForScriptingAsBoolean
Publicm_fSafeForInitializingAsBoolean

SubMain()
m_fSafeForScripting=True
m_fSafeForInitializing=True
EndSub
在工程属性中把启动对象改成SubMain确保上述代码会被执行。m_fSafeForScripting和m_fSafeForInitializing两件变量的值分别指定了脚本安全和初始化安全取值。


打开控件代码窗口,在声明部分加入如下代码(如果有OptionExplicit语句,当然要保证代码放在其后):


ImplementsIObjectSafety
把下面两个过程代码拷贝到控件代码中:


PrivateSubIObjectSafety_GetInterfaceSafetyOptions(ByValriidAs_
Long,pdwSupportedOptionsAsLong,pdwEnabledOptionsAsLong)

DimRc AsLong
DimrClsId AsudtGUID
DimIID AsString
DimbIID() AsByte

pdwSupportedOptions=INTERFACESAFE_FOR_UNTRUSTED_CALLEROr_
INTERFACESAFE_FOR_UNTRUSTED_DATA

If(riid<>0)Then
CopyMemoryrClsId,ByValriid,Len(rClsId)

bIID=String$(MAX_GUIDLEN,0)
Rc=StringFromGUID2(rClsId,VarPtr(bIID(0)),MAX_GUIDLEN)
Rc=InStr(1,bIID,vbNullChar)-1
IID=Left$(UCase(bIID),Rc)

SelectCaseIID
CaseIID_IDispatch
pdwEnabledOptions=IIf(m_fSafeForScripting,_
INTERFACESAFE_FOR_UNTRUSTED_CALLER,0)
ExitSub
CaseIID_IPersistStorage,IID_IPersistStream,_
IID_IPersistPropertyBag
pdwEnabledOptions=IIf(m_fSafeForInitializing,_
INTERFACESAFE_FOR_UNTRUSTED_DATA,0)
ExitSub
CaseElse
Err.RaiseE_NOINTERFACE
ExitSub
EndSelect
EndIf
EndSub

PrivateSubIObjectSafety_SetInterfaceSafetyOptions(ByValriidAs_
Long,ByValdwOptionsSetMaskAsLong,ByValdwEnabledOptionsAsLong)
DimRc AsLong
DimrClsId AsudtGUID
DimIID AsString
DimbIID() AsByte

If(riid<>0)Then
CopyMemoryrClsId,ByValriid,Len(rClsId)

bIID=String$(MAX_GUIDLEN,0)
Rc=StringFromGUID2(rClsId,VarPtr(bIID(0)),MAX_GUIDLEN)
Rc=InStr(1,bIID,vbNullChar)-1
IID=Left$(UCase(bIID),Rc)

SelectCaseIID
CaseIID_IDispatch
If((dwEnabledOptionsAnddwOptionsSetMask)<>_
INTERFACESAFE_FOR_UNTRUSTED_CALLER)Then
Err.RaiseE_FAIL
ExitSub
Else
IfNotm_fSafeForScriptingThen
Err.RaiseE_FAIL
EndIf
ExitSub
EndIf

CaseIID_IPersistStorage,IID_IPersistStream,_
IID_IPersistPropertyBag
If((dwEnabledOptionsAnddwOptionsSetMask)<>_
INTERFACESAFE_FOR_UNTRUSTED_DATA)Then
Err.RaiseE_FAIL
ExitSub
Else
IfNotm_fSafeForInitializingThen
Err.RaiseE_FAIL
EndIf
ExitSub
EndIf

CaseElse
Err.RaiseE_NOINTERFACE
ExitSub
EndSelect
EndIf
EndSub
保存后,把工程编译成OCX文件。现在控件已经实现了IObjectSafety接口。在.htm中加入这件控件试一试吧。

蒋晟 2005-11-25
  • 打赏
  • 举报
回复
明显是安全性问题
控件有没有实现IObjectSafety?

1,453

社区成员

发帖
与我相关
我的任务
社区描述
VB 控件
社区管理员
  • 控件
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧