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

요약

loadTOCNode(1, ‘summary’);

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

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

위로 가기

추가 정보

loadTOCNode(1, ‘moreinformation’);

경고: 이 문서에서는 VarPtr, VarPtrArray, VarPtrStringArray, StrPtr 및 ObjPtr 함수 중 하나 이상에 대해 설명하지만 Microsoft 기술 지원 서비스에서는 이러한 함수를 지원하지 않습니다. 이러한 함수는 Visual Basic 설명서에서 다루지 않으며 이 기술 자료 문서에서 “있는 그대로” 제공됩니다. Microsoft는 Visual Basic의 향후 릴리스에서 이러한 함수를 사용할 수 있게 된다고 보증하지 않습니다. 이러한 함수에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.

199824 (http://support.microsoft.com/kb/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 파일에 컨트롤을 삽입합니다.

위로 가기

참조

loadTOCNode(1, ‘references’); MkTypLib.exe는 이전에 Microsoft Visual Studio 6.0에 포함된 Platform SDK(Software Development Kit)와 함께 제공된 오래된 도구입니다. Visual Studio 6.0에 포함된 Platform SDK를 설치하는 방법에 대한 자세한 내용은 다음 Microsoft 웹 사이트를 참조하십시오.

최신 Platform SDK에는 MkTypLib.exe 도구가 들어 있지 않습니다. 어떤 Microsoft 제품에 형식 라이브러리 컴파일러(MkTypLib.exe)가 제공되는지에 대한 자세한 내용을 보려면 다음 Microsoft DLL 도움말 데이터베이스에서 MkTypLib.exe라는 파일 이름을 검색하십시오.

MkTypLib를 실행하는 방법에 대한 자세한 내용은 다음 Microsoft 웹 사이트를 참조하십시오.

자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.

161873 (http://support.microsoft.com/kb/161873/) HOWTO: MFC 컨트롤을 스크립트 사용에 안전(Safe for Scripting)/초기화에 안전(Safe for Initialization)으로 표시
143258 (http://support.microsoft.com/kb/143258/) 형식 라이브러리에서 상수 및 DLL 선언을 만드는 방법
131105 (http://support.microsoft.com/kb/131105/) 샘플: TYPEBLD: ICreateTypeLib 및 ICreateTypeInfo를 사용하는 방법

IObjectSafety 인터페이스에 대한 자세한 내용은 다음 Microsoft 웹 사이트를 참조하십시오.

ActiveX 컨트롤의 초기화 및 스크립팅 안전에 대한 자세한 내용은 다음 Microsoft 웹 사이트를 참조하십시오.

Microsoft Internet Explorer용 웹 기반 솔루션 개발에 대한 자세한 내용을 보려면 다음 Microsoft 웹 사이트를 방문하십시오.

Advertisements

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중