Bài vi?t này mô t? làm th? nào đ? th?c hi?n các IObjectSafety giao di?n đi?u khi?n Visual Basic đ? đánh d?u các đi?u khi?n an toàn cho k?ch b?n và
kh?i t?o. Theo m?c đ?nh, đi?u khi?n Visual Basic s? d?ng thành ph?n th? lo?i
m?c trong registry đ? đánh d?u s? ki?m soát an toàn cho k?ch b?n và
kh?i t?o. Tri?n khai th?c hi?n các IObjectSafety giao di?n là phương pháp ưa thích. Bài vi?t này ch?a t?t c? các m? đư?c yêu c?u đ? th?c hi?n giao di?n này trong đi?u khi?n Visual Basic.
H?y ghi nh? r?ng m?t đi?u khi?n ch? nên đư?c đánh d?u an toàn n?u nó là,
trong th?c t?, an toàn. Bài vi?t này không mô t? chi ti?t c?a đánh d?u
đi?u khi?n như là an toàn cho k?ch b?n và kh?i t?o; nó ch? đơn gi?n là ch?ng t? làm th? nào đ? làm đi?u đó trong m?. H?y tham kh?o tài li?u hư?ng d?n Internet khách hàng ph?n m?m phát tri?n Kit (SDK) cho m?t mô t? chi ti?t v? đi?u này. Xem "An toàn kh?i t?o và script cho ActiveX Controls" dư?i ph?n thành ph?n phát tri?n.
C?NH BÁO: M?t ho?c nhi?u các ch?c năng sau đây s? đư?c th?o lu?n trong bài vi?t này: VarPtr, VarPtrArray, VarPtrStringArray, StrPtr, và ObjPtr. Các ch?c năng này không đư?c h? tr? b?i Microsoft h? tr? k? thu?t. H? không đư?c di?n t? trong tài li?u Visual Basic và đư?c cung c?p trong bài vi?t cơ s? ki?n th?c này "như." Microsoft không đ?m b?o r?ng h? s? có s?n trong b?n phát hành tương lai c?a Visual Basic. Đ? bi?t thêm chi ti?t v? các ch?c năng này, b?m vào s? bài vi?t dư?i đây đ? xem bài vi?t trong cơ s? ki?n th?c Microsoft:
Làm th? nào đ? có đư?c đ?a ch? c?a bi?n trong Visual Basic
Các bư?c sau đây minh ho? làm th? nào đ? t?o ra m?t đi?u khi?n Visual Basic đơn gi?n và đánh d?u nó an toàn cho k?ch b?n và kh?i t?o.
T?o m?t thư m?c m?i, nơi b?n có th? lưu t?t c? các file mà b?n t?o ra trong ví d? này.
Nh?n đư?c các máy phát đi?n thư vi?n t? đ?ng hóa ki?u OLE t? đ?a CD-ROM Visual Basic 6.0. Đ? th?c hi?n vi?c này, sao chép t?t c? b?n t?p tin t? thư m?c \Common\Tools\VB\Unsupprt\Typlib\ thư m?c d? án c?a b?n. Chú ý: Sao chép t?t c? các t?p tin t? thư m?c \VB5.0\Tools\Unsupprt\Typlib\ trong VIsual Basic 5.0.
Sao chép các văn b?n sau vào Notepad và lưu các t?p tin trong thư m?c d? án là 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);
}
}
M?t d?u nh?c l?nh, s? d?ng các Đ?A CD<path></path> l?nh đ? di chuy?n vào thư m?c d? án, và g? l?nh sau đây đ? t?o ra m?t t?p tin .tlb:
MKTYPLIB objsafe.odl /tlb objsafe.tlb
T? Visual Basic, t?o ra m?t d? án đi?u khi?n ActiveX. Trong các Thu?c tính danh sách, thay đ?i tên d? án IObjSafety và tên c?a b? đi?u khi?n đ? DemoCtl. Đ?t m?t CommandButton tên là cmdTest trên b? đi?u khi?n. Trong x? l? s? ki?n Click c?a cmdTest, đ?t m?t MsgBox "Th? nghi?m" tuyên b?.
Trên các Dự án tr?nh đơn, nh?p vào Tham khảo, duy?t đ?n và thêm Objsafe.tlb, mà b?n t?o ra trư?c đó.
Thêm m?t mô-đun m?i đ? d? án c?a b?n v?i m? sau đây, và tên mô-đun 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
T? thu?c tính d? án, thay đ?i các đ?i tư?ng kh?i đ?ng đ? Ph? chính đ? th?c hi?n các ph? chính ? trên. S? d?ng các m_fSafeForScripting và m_fSafeForInitializing bi?n đ? xác đ?nh giá tr? c?a an toàn cho các k?ch b?n và/ho?c kh?i t?o bi?n.
M? c?a s? m? đi?u khi?n c?a b?n. Thêm d?ng sau m? ph?n tuyên b? (ngay sau khi l?a ch?n r? ràng ho?c là ngư?i đ?u tiên):
Implements IObjectSafety
Sao hai th? t?c sau đây vào m? đi?u khi?n c?a b?n:
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
Trên các Tệp tr?nh đơn, ti?t ki?m c?a b?n d? án và các t?p tin. Làm cho m?t t?p tin OCX t? d? án c?a b?n. Đi?u khi?n c?a b?n bây gi? th?c hi?n các IObjectSafety giao di?n. Đ? ki?m tra nó, chèn s? ki?m soát trong m?t t?p tin .htm.
MkTypLib.exe là m?t công c? c? mà trư?c đó đư?c v?n chuy?n v?i các n?n t?ng ph?n m?m phát tri?n Kit (SDK) mà đi kèm v?i Microsoft Visual Studio 6.0. Hi?n t?i n?n t?ng SDK không đ?n v?i các công c? MkTypLib.exe.
Thông tin v? làm th? nào đ? g?i MkTypLib, xem Web site sau c?a Microsoft:
ID c?a bài: 182598 - L?n xem xét sau cùng: 20 Tháng Tám 2011 - Xem xét l?i: 2.0
Áp d?ng
Microsoft Visual Basic 5.0 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
T? khóa:
kbFAQ kbhowto kbmt KB182598 KbMtvi
Máy d?ch
QUAN TRỌNG: Bài vi?t này đư?c d?ch b?ng ph?n m?m d?ch máy c?a Microsoft ch? không ph?i do con ngư?i d?ch. Microsoft cung c?p các bài vi?t do con ngư?i d?ch và c? các bài vi?t do máy d?ch đ? b?n có th? truy c?p vào t?t c? các bài vi?t trong Cơ s? Ki?n th?c c?a chúng tôi b?ng ngôn ng? c?a b?n. Tuy nhiên, bài vi?t do máy d?ch không ph?i lúc nào c?ng hoàn h?o. Lo?i bài vi?t này có th? ch?a các sai sót v? t? v?ng, cú pháp ho?c ng? pháp, gi?ng như m?t ngư?i nư?c ngoài có th? m?c sai sót khi nói ngôn ng? c?a b?n. Microsoft không ch?u trách nhi?m v? b?t k? s? thi?u chính xác, sai sót ho?c thi?t h?i nào do vi?c d?ch sai n?i dung ho?c do ho?t đ?ng s? d?ng c?a khách hàng gây ra. Microsoft c?ng thư?ng xuyên c?p nh?t ph?n m?m d?ch máy này.
Nh?p chu?t vào đây đ? xem b?n ti?ng Anh c?a bài vi?t này:182598