티스토리 뷰


요약


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 자동화 형식 라이브러리 생성기를 가져옵니다. 이 생성기를 가져오려면 CommonToolsVBUnsupprtTyplib 폴더에 있는 네 파일을 모두 프로젝트 폴더로 복사합니다.

참고: Visual Basic 5.0의 경우 VB5.0ToolsUnsupprtTyplib 폴더에 있는 파일을 모두 복사하십시오.
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 웹 사이트를 참조하십시오.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sdkintro/sdkintro/installing_the_platform_sdk_with_visual_studio.asp (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 (http://support.microsoft.com/?scid=http%3a%2f%2fsupport.microsoft.com%2fservicedesks%2ffileversion%2fdllinfo.asp)

MkTypLib를 실행하는 방법에 대한 자세한 내용은 다음 Microsoft 웹 사이트를 참조하십시오.
http://www.microsoft.com/msj/0297/visualprog/visualprog0297.aspx (http://www.microsoft.com/msj/0297/visualprog/visualprog0297.aspx)(영문)

자세한 내용은 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 웹 사이트를 참조하십시오.
http://msdn.microsoft.com/workshop/components/com/reference/ifaces/iobjectsafety/iobjectsafety.asp (http://msdn.microsoft.com/workshop/components/com/reference/ifaces/iobjectsafety/iobjectsafety.asp)(영문)

ActiveX 컨트롤의 초기화 및 스크립팅 안전에 대한 자세한 내용은 다음 Microsoft 웹 사이트를 참조하십시오.
http://msdn.microsoft.com/workshop/components/activex/safety.asp (http://msdn.microsoft.com/workshop/components/activex/safety.asp)(영문)

Microsoft Internet Explorer용 웹 기반 솔루션 개발에 대한 자세한 내용을 보려면 다음 Microsoft 웹 사이트를 방문하십시오.
http://www.microsoft.com/korea/msdn/ie/ (http://www.microsoft.com/korea/msdn/ie/)

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