Как реализовать IObjectSafety в элементы управления Visual Basic

Переводы статьи Переводы статьи
Код статьи: 182598 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

Аннотация

В данной статье описываются способы реализации IObjectSafety интерфейс в элементах управления Visual Basic, чтобы пометить безопасные элементы управления и Инициализация. По умолчанию элементы управления Visual Basic с помощью категории компонентов записи в реестр, чтобы пометить элемент управления как безопасный для сценариев и Инициализация. Реализация IObjectSafety интерфейс является предпочтительным методом. Данная статья содержит весь код, необходимый для реализации этого интерфейса элементов управления Visual Basic.

Пожалуйста, имейте в виду, что элемент управления должны только быть помечены как безопасные, если это так, Фактически, безопасном. В этой статье описывается детали маркировки элементы управления как безопасный для сценариев и инициализации; просто показано, как это можно сделать в коде. Обратитесь к документации обозревателя клиента Software Development Kit (SDK) подробное описание. См «Безопасный инициализацию и сценарии для элементов ActiveX» в разделе разработки компонента.

Дополнительная информация

ПРЕДУПРЕЖДЕНИЕ: В этой статье обсуждаются один или несколько из следующих функций: VarPtr, VarPtrArray, VarPtrStringArray, StrPtr и ObjPtr. Эти функции не поддерживаются службой технической поддержки корпорации Майкрософт. Они не описаны в документации Visual Basic и предоставляются в этой статье базы знаний «как есть». Корпорация Майкрософт не гарантирует, что они будут доступны в будущих версиях Visual Basic. Для получения дополнительных сведений об этих функциях щелкните следующий номер статьи базы знаний Майкрософт:
199824 Как получить адрес переменных в Visual Basic
Следующие шаги показывают, как создать простой элемент управления Visual Basic и пометить безопасный для написания сценариев и инициализации.
  1. Создайте новую папку, где можно сохранить все файлы, создаваемые в этом примере.
  2. Получите генератор библиотеки типов автоматизации OLE с компакт-диска Visual Basic 6.0. Для этого скопируйте все четыре файла из папки \Common\Tools\VB\Unsupprt\Typlib\ в папку проекта. Примечание: Копировать все файлы из папки \VB5.0\Tools\Unsupprt\Typlib\ в VIsual Basic 5.0.
  3. Скопируйте следующий текст в Блокнот и сохраните файл в папке проекта с 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);
               }
           }
    					
  4. В командной строке с помощью КОМПАКТ-ДИСК<path></path> команды Переместить в папку проекта и введите следующую команду для создания файла .tlb.
    / Tlb objsafe.odl MKTYPLIB objsafe.tlb
  5. С помощью Visual Basic создайте проект элемента управления ActiveX. В Свойства список, измените имя проекта IObjSafety Имя элемента управления и DemoCtl. Размещение с именем cmdTest на элемент управления CommandButton. В обработчике события Click cmdTest поместите оператор «Тестирование» MsgBox.
  6. На Проект меню, нажмите кнопку Ссылки, найдите и добавьте Objsafe.tlb, которая была создана ранее.
  7. Добавьте в новый модуль следующий код к проекту, а имя модуля basSafeCtl:
          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
    					
  8. В свойствах проекта измените начальный объект Процедура Sub Main для выполнения выше Sub Main. Использование m_fSafeForScripting и m_fSafeForInitializing переменные для указания значения безопасный для сценариев и инициализации переменных.
  9. Откройте окно кода элемента управления. Добавьте следующий код в раздел объявлений (сразу же после Option Explicit или первой):
    Implements IObjectSafety
    					
  10. Скопируйте код элементов управления следующие две процедуры:
          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
    					
  11. На Файл меню, сохраните проект и файлы. Внесите в файл OCX из проекта. Теперь элемент управления реализует IObjectSafety интерфейс. Чтобы проверить его, вставьте элемент управления в файле .htm.

Ссылки

MkTypLib.exe — это старый средство, которое ранее поставляются с Platform Software Development Kit (SDK), поставляемых вместе с Microsoft Visual Studio 6.0. Текущего пакета Platform SDK поставляется с помощью средства MkTypLib.exe.

Сведения о том, как вызвать MkTypLib содержатся в разделе веб-узел корпорации Майкрософт:
http://www.Microsoft.com/MSJ/0297/visualprog/visualprog0297.aspx
Для получения дополнительных сведений щелкните следующий номер статьи базы знаний Майкрософт:
161873 Как безопасные элементы управления MFC знак для сценариев и инициализации
143258 Создание объявления DLL и константы в библиотеку типов
131105 Пример: TYPEBLD: использование ICreateTypeLib и ICreateTypeInfo
Для получения дополнительных сведений о IObjectSafety интерфейс, посетите веб-узел корпорации Майкрософт:
http://MSDN.Microsoft.com/en-us/library/aa911729.aspx
Для получения дополнительных сведений о безопасном инициализацию и сценарии для элементов управления ActiveX просмотра веб-узел корпорации Майкрософт:
http://msdn2.Microsoft.com/en-us/library/Aa751977.aspx
Для получения дополнительных сведений о разработке веб-приложений для Microsoft Internet Explorer посетите веб-узлы корпорации Майкрософт:
http://MSDN.Microsoft.com/IE/

http://support.Microsoft.com/IEP

Свойства

Код статьи: 182598 - Последний отзыв: 4 июня 2011 г. - Revision: 4.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft Visual Basic Control Creation Edition
  • Microsoft Visual Basic 5.0 Professional Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic 5.0 Enterprise Edition
  • Microsoft Visual Basic 5.0 Learning Edition
  • Microsoft Internet Explorer 4.01 Service Pack 1
Ключевые слова: 
kbFAQ kbhowto kbmt KB182598 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:182598

Отправить отзыв

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com