Visual Basic 컨트롤에서 IObjectSafety를 구현하는 방법

기술 자료 번역 기술 자료 번역
기술 자료: 182598 - 이 문서가 적용되는 제품 보기.
모두 확대 | 모두 축소

요약

이 문서에서는 Visual Basic 컨트롤에서 IObjectSafety 인터페이스를 구현하여 컨트롤이 스크립팅과 초기화에 안전하다고 표시하는 방법을 설명합니다. 기본적으로 Visual Basic 컨트롤은 레지스트리의 구성 요소 범주 항목을 사용하여 컨트롤이 스크립팅과 초기화에 안전하다고 표시합니다. IObjectSafety 인터페이스를 구현하는 방법이 더 많이 사용됩니다. 이 문서에는 Visual Basic 컨트롤에서 이 인터페이스를 구현하는 데 필요한 모든 코드가 들어 있습니다.

실제로 안전한 컨트롤에 대해서만 안전하다는 표시를 해야 합니다. 이 문서에서는 컨트롤이 스크립팅과 초기화에 안전하다고 표시하는 방법을 자세히 설명하지 않고 코드에서 이를 수행하는 방법만 보여 줍니다. 이에 대한 자세한 내용은 Internet Client SDK(Software Development Kit) 설명서의 구성 요소 개발(Component Development) 절에서 "ActiveX 컨트롤에 대한 안전한 초기화 및 스크립팅(Safe Initialization and Scripting for ActiveX Controls)"을 참조하십시오.

추가 정보

경고: 이 문서에서는 VarPtr, VarPtrArray, VarPtrStringArray, StrPtr 및 ObjPtr 함수 중 하나 이상에 대해 설명하지만 Microsoft 기술 지원 서비스에서는 이러한 함수를 지원하지 않습니다. 이러한 함수는 Visual Basic 설명서에서 다루지 않으며 이 기술 자료 문서에서 "있는 그대로" 제공됩니다. Microsoft는 Visual Basic의 향후 릴리스에서 이러한 함수를 사용할 수 있게 된다고 보증하지 않습니다. 이러한 함수에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
199824 Visual Basic에서 변수 주소를 가져오는 방법
다음 단계는 간단한 Visual Basic 컨트롤을 만들고 스크립팅과 초기화에 안전하다고 표시하는 방법을 보여 줍니다.
  1. 이 예제에서 만드는 모든 파일을 저장할 수 있는 새 폴더를 만듭니다.
  2. Visual Basic 6.0 CD-ROM에서 OLE 자동화 형식 라이브러리 생성기를 가져옵니다. 이 생성기를 가져오려면 \Common\Tools\VB\Unsupprt\Typlib\ 폴더에 있는 네 파일을 모두 프로젝트 폴더로 복사합니다.

    참고: Visual Basic 5.0의 경우 \VB5.0\Tools\Unsupprt\Typlib\ 폴더에 있는 파일을 모두 복사하십시오.
  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. 명령 프롬프트에서 CD <path> 명령을 사용하여 프로젝트 폴더로 이동하고 다음 명령을 입력하여 .tlb 파일을 생성합니다.
    MKTYPLIB objsafe.odl /tlb objsafe.tlb
  5. Visual Basic에서 ActiveX 컨트롤 프로젝트를 만듭니다. 속성 목록에서 프로젝트 이름을 IObjSafety로 변경하고 컨트롤 이름을 DemoCtl로 변경합니다. cmdTest라는 CommandButton을 컨트롤에 추가합니다. cmdTest의 Click 이벤트 처리기에 MsgBox "Test" 문을 추가합니다.
  6. 프로젝트 메뉴에서 References를 누르고 앞에서 만든 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_fSafeForScriptingm_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는 이전에 Microsoft Visual Studio 6.0에 포함된 Platform SDK(Software Development Kit)와 함께 제공된 오래된 도구입니다. Visual Studio 6.0에 포함된 Platform SDK를 설치하는 방법에 대한 자세한 내용은 다음 Microsoft 웹 사이트를 참조하십시오.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sdkintro/sdkintro/installing_the_platform_sdk_with_visual_studio.asp(영문)
최신 Platform SDK에는 MkTypLib.exe 도구가 들어 있지 않습니다. 어떤 Microsoft 제품에 형식 라이브러리 컴파일러(MkTypLib.exe)가 제공되는지에 대한 자세한 내용을 보려면 다음 Microsoft DLL 도움말 데이터베이스에서 MkTypLib.exe라는 파일 이름을 검색하십시오.
http://support.microsoft.com/dllhelp
MkTypLib를 실행하는 방법에 대한 자세한 내용은 다음 Microsoft 웹 사이트를 참조하십시오.
http://www.microsoft.com/msj/0297/visualprog/visualprog0297.aspx(영문)
자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
161873 HOWTO: MFC 컨트롤을 스크립트 사용에 안전(Safe for Scripting)/초기화에 안전(Safe for Initialization)으로 표시
143258 형식 라이브러리에서 상수 및 DLL 선언을 만드는 방법
131105 샘플: TYPEBLD: ICreateTypeLib 및 ICreateTypeInfo를 사용하는 방법
IObjectSafety 인터페이스에 대한 자세한 내용은 다음 Microsoft 웹 사이트를 참조하십시오.
http://msdn.microsoft.com/workshop/components/com/reference/ifaces/iobjectsafety/iobjectsafety.asp(영문)
ActiveX 컨트롤의 초기화 및 스크립팅 안전에 대한 자세한 내용은 다음 Microsoft 웹 사이트를 참조하십시오.
http://msdn.microsoft.com/workshop/components/activex/safety.asp(영문)
Microsoft Internet Explorer용 웹 기반 솔루션 개발에 대한 자세한 내용을 보려면 다음 Microsoft 웹 사이트를 방문하십시오.
http://www.microsoft.com/korea/msdn/ie/

http://support.microsoft.com/iep(영문)




Microsoft 제품 관련 기술 전문가들과 온라인으로 정보를 교환하시려면 Microsoft 뉴스 그룹에 참여하시기 바랍니다.

속성

기술 자료: 182598 - 마지막 검토: 2006년 9월 13일 수요일 - 수정: 5.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 6.0 Enterprise Edition
  • Microsoft Visual Basic 5.0 Learning Edition
  • Microsoft Visual Basic 6.0 Learning Edition
  • Microsoft Internet Explorer 4.0 128-Bit Edition
  • Microsoft Internet Explorer 4.01 서비스 팩 2
  • Microsoft Internet Explorer 4.01 서비스 팩 1
  • Microsoft Internet Explorer 4.01 서비스 팩 2
  • Microsoft Internet Explorer 5.0
  • Microsoft Internet Explorer 5.01
  • Microsoft Internet Explorer (Programming) 5.01 SP1
  • Microsoft Internet Explorer 5.5
키워드:?
kbhowto kbfaq KB182598

피드백 보내기

 

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