Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.
Este artigo descreve como implementar a interface IObjectSafety nos controlos do Visual Basic para marcar os controlos seguros para inicialização e scripts. Por predefinição, controlos de Visual Basic utilizam componente categoria entradas no registo para marcar o controlo seguro para inicialização e scripts. Implementar a interface IObjectSafety é o método preferido. Este artigo contém todo o código que é necessário para implementar esta interface no Visual Basic controlos.
Não se esqueça de que um controlo deve apenas ser assinalado como sendo como seguro se for, na realidade, seguro. Este artigo não descreve os detalhes de marcar controlos como seguros para inicialização e scripts; ele simplesmente demonstra como fazê-lo no código. Por favor consulte a documentação do Internet Client Software Development Kit (SDK) para obter uma descrição detalhada deste. Consulte "Segurança inicialização e scripts para controlos ActiveX" na secção de desenvolvimento de componentes.
Aviso: um ou mais das seguintes funções são abordados neste artigo: VarPtr, VarPtrArray, VarPtrStringArray, StrPtr, ObjPtr e. Estas funções não são suportadas pelo suporte técnico da Microsoft. Eles não estão documentados na documentação do Visual Basic e são fornecidos neste artigo da base de dados de conhecimento "tal como"está. A Microsoft não garante que estarão disponíveis em versões futuras do Visual Basic. Para obter informações adicionais sobre estas funções, clique no número de artigo existente abaixo para visualizar o artigo na base de dados de conhecimento da Microsoft:
199824
(http://support.microsoft.com/kb/199824/EN-US/
)
Como obter o endereço de variáveis no Visual Basic
Os passos seguintes ilustram como criar um controlo do Visual Basic simples e marcá-lo seguro para inicialização e scripts.
Crie uma nova pasta onde pode guardar todos os ficheiros que criar neste exemplo.
Obter o gerador de biblioteca de tipos de automatização OLE a partir do CD-ROM do Visual Basic 6.0. Para o fazer, copie os quatro ficheiros da pasta \Common\Tools\VB\Unsupprt\Typlib\ para a pasta de projecto. Nota: copiar todos os ficheiros da pasta \VB5.0\Tools\Unsupprt\Typlib\ do VIsual Basic 5.0.
Copie o seguinte texto no bloco de notas e guarde o ficheiro na pasta do projecto como Objsafe.odl:
[
uuid(C67830E0-D11D-11cf-BD80-00AA00575603),
helpstring("VB IObjectSafety Interface"),
version(1.0)
]
library IObjectSafetyTLB
{
importlib("stdole2.tlb");
[
uuid(CB5BDC81-93C1-11cf-8F20-00805F2CD064),
helpstring("IObjectSafety Interface"),
odl
]
interface IObjectSafety:IUnknown {
[helpstring("GetInterfaceSafetyOptions")]
HRESULT GetInterfaceSafetyOptions(
[in] long riid,
[in] long *pdwSupportedOptions,
[in] long *pdwEnabledOptions);
[helpstring("SetInterfaceSafetyOptions")]
HRESULT SetInterfaceSafetyOptions(
[in] long riid,
[in] long dwOptionsSetMask,
[in] long dwEnabledOptions);
}
}
Na linha de comandos, utilize o CD de <path><caminho> comando para mover para a pasta de projecto e escreva o seguinte comando para gerar um ficheiro .tlb:
MKTYPLIB objsafe.odl /tlb objsafe.tlb
A partir do Visual Basic, crie um projecto de controlo ActiveX. Na lista de Propriedades, altere o nome do projecto para IObjSafety e o nome do controlo para DemoCtl. Coloque um CommandButton chamado cmdTest no controlo. No processador de evento clicar do cmdTest, coloque uma instrução de MsgBox "Teste".
No menu projecto, clique em References, navegue para e adicione Objsafe.tlb criado anteriormente.
Adicionar um novo módulo de projecto com o seguinte código e, nome basSafeCtl módulo:
Option Explicit
Public Const IID_IDispatch = "{00020400-0000-0000-C000-000000000046}"
Public Const IID_IPersistStorage = _
"{0000010A-0000-0000-C000-000000000046}"
Public Const IID_IPersistStream = _
"{00000109-0000-0000-C000-000000000046}"
Public Const IID_IPersistPropertyBag = _
"{37D84F60-42CB-11CE-8135-00AA004BB851}"
Public Const INTERFACESAFE_FOR_UNTRUSTED_CALLER = &H1
Public Const INTERFACESAFE_FOR_UNTRUSTED_DATA = &H2
Public Const E_NOINTERFACE = &H80004002
Public Const E_FAIL = &H80004005
Public Const MAX_GUIDLEN = 40
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(pDest As Any, pSource As Any, ByVal ByteLen As Long)
Public Declare Function StringFromGUID2 Lib "ole32.dll" (rguid As _
Any, ByVal lpstrClsId As Long, ByVal cbMax As Integer) As Long
Public Type udtGUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(7) As Byte
End Type
Public m_fSafeForScripting As Boolean
Public m_fSafeForInitializing As Boolean
Sub Main()
m_fSafeForScripting = True
m_fSafeForInitializing = True
End Sub
A partir das propriedades do projecto, altere o objecto de arranque para Sub Main para executar a sub main acima. Utilize as variáveis de m_fSafeForScripting e m_fSafeForInitializing para especificar os valores de seguro para as variáveis e/scripts ou inicialização.
Abra a janela de código do controlo. Adicione a seguinte linha de código para a secção de declaração (logo após Option Explicit ou como o primeiro):
Implements IObjectSafety
Copie os dois procedimentos que se seguem para o código de controlos:
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
No menu ficheiro, guarde o projecto e os ficheiros. Criar um ficheiro OCX do projecto. O controlo agora implementa a interface IObjectSafety. Para o testar, insira o controlo num ficheiro .htm.
MkTypLib.exe é uma ferramenta antiga que anteriormente enviados com o Platform Software Development Kit (SDK) que é fornecido com o Microsoft Visual Studio 6.0. O actual Platform SDK não ficar com a ferramenta de MkTypLib.exe.
Para obter informações sobre como invocar MkTypLib, consulte o seguinte site da Microsoft:
Para obter informações adicionais, clique nos números de artigo existentes abaixo para visualizar os artigos na base de dados de conhecimento da Microsoft:
161873
(http://support.microsoft.com/kb/161873/EN-US/
)
Como marcar MFC controlos seguros para inicialização/scripts
143258
(http://support.microsoft.com/kb/143258/EN-US/
)
Como criar constantes e declarações de DLL numa biblioteca de tipos
131105
(http://support.microsoft.com/kb/131105/EN-US/
)
EXEMPLO: TYPEBLD: como utilizar ICreateTypeLib e ICreateTypeInfo
Para mais informações sobre a interface IObjectSafety, consulte o seguinte site da Microsoft:
Para obter mais informações sobre como desenvolver soluções baseadas na Web para o Microsoft Internet Explorer, visite os seguintes sites da Microsoft:
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 182598
(http://support.microsoft.com/kb/182598/en-us/
)
Qual foi o esforço que despendeu pessoalmente para utilizar este artigo?
Muito baixo
Baixo
Moderado
Elevado
Muito elevado
Diga-nos porquê e o que podemos fazer para melhorar estas informações
Obrigado! Os seus comentários são utilizados para ajudar-nos a melhorar o conteúdo do nosso suporte. Para obter mais opções de assistência, visite a Home Page de Ajuda e Suporte.