早期系結支援
下列程式代碼範例提供已就地提供早期系結支援的案例。
Dim x as IADsUser
Dim y as IADsExt1
Dim z as IADsExt2
Set x = GetObject("LDAP://CN=JeffSmith, OU=Sales,
DC=Fabrikam,DC=COM")
x.SetPassword("newPassword")
Set y = x
y.MyNewMethod( "\\srv\public")
y.MyProperty = "Hello World"
Set z = y
z.OtherMethod()
z.OtherProperty = 4362
Debug.Print x.LastName
Set z = GetObject("LDAP://CN=Jeff,OU=Engr,
DC=Fabrikam,DC=COM")
z.OtherProperty = 5323
在此程式代碼範例中,兩個 擴充元件會擴充用戶 物件。 每個延伸模組都會發佈自己的介面。 每個延伸模組都無法辨識其他擴充介面;只有ADSI可辨識這兩個延伸模組的存在。 每個擴充功能都會將其 IUnknown 委派給 ADSI。 ADSI 會作為延伸模組和其他任何其他延伸模組的匯總工具。 從任何延伸模組或 ADSI 查詢介面會產生相同的一致結果。
下列程序說明如何建立延伸模組。
步驟 1:將匯總新增至您的元件
請遵循 COM 規格,將匯總新增至您的元件。 總而言之,您必須在 CreateInstance 期間接受對元件的 pUnknown 要求,並在匯總元件時將 pUnknown 委派給匯總工具的 IUnknown。
步驟 2:註冊擴充功能
現在您必須決定要擴充的目錄類別。 您無法使用相同的介面來完成這個作業,例如 IADsUser、IADsComputer。 目錄物件會保存在目錄中,而您的擴充功能和 ADSI 是在用戶端電腦上執行。 目錄物件範例包括使用者、計算機、printQueue、service 連線 ionPoint 和 nTDSService。 您也可以在 Active Directory 中新增類別,並為這個新類別建立新的擴充功能。
您可以使用登錄機碼將目錄類別名稱與 ADSI 延伸模組元件產生關聯。 下圖代表現有的登錄配置,以及新的機碼。
- 名為 Extensions 的新索引鍵包含索引鍵清單,每個索引鍵都代表目錄中的類別。 例如, 使用者、 printQueue 或 計算機,每個類別都會維護子機碼的清單。
- 每個子機碼都包含ADSI擴充元件的CLSID。
- 每個 CLSID 子機碼都包含允許多個值的字串專案。 您應該只列出參與匯總的介面。
注意
註冊標準 COM 金鑰仍然需要擴充物件。
HKEY_LOCAL_MACHINE
Software
Microsoft
ADS
Providers
LDAP
Extensions
ClassNameA
CLSID of ExtensionA1
Interfaces = List of interfaces
CLSID of ExtensionA2
Interfaces = List of interfaces
ClassNameB
CLSID of ExtensionB1
Interfaces = List of interfaces
CLSID of ExtensionB2
Interfaces = List of interfaces
範例
HKEY_LOCAL_MACHINE
SOFTWARE
Microsoft
ADs
Providers
LDAP
Extensions
printQueue
{9f37f39c-6f49-11d1-8c18-00c04fd8d503}
Interfaces = {466841B0-E531-11d1-8718-00C04FD44407}
{466841B1-E531-11d1-8718-00C04FD44407}
Extension1 的介面清單可能不同於 Extension2 的介面清單。 當使用中時,對象支援匯總工具 (ADSI) 的介面,以及匯總的 Extension1 和 Extension2 所提供的所有介面。 解決衝突介面(匯總器和匯總所支援的相同介面,或由多個匯總所支援)取決於延伸模組的優先順序。
您也可以將 CLSID 延伸模組與多個物件類別名稱產生關聯。 例如,您的延伸模組可以同時擴充 用戶 和 聯繫人 物件。
注意
擴充行為會新增至每個物件類別,而不是在每個物件實例上。
最佳做法是,使用 DllRegisterSvr 函式的呼叫來註冊延伸模組,就像您任何其他 COM 元件一樣。 也提供使用 DllUnregisterServer 函式取消註冊擴充功能的功能。
下列程式代碼範例示範如何註冊延伸模組。
/////
// Register the class.
///////////////////////
hr = RegCreateKeyEx( HKEY_LOCAL_MACHINE,
_T("SOFTWARE\\Microsoft\\ADs\\Providers\\LDAP\\Extensions\\User\\{E1E3EDF8-48D1-11D2-B22B-0000F87A6B50}"),
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_WRITE,
NULL,
&hKey,
&dwDisposition );
///////////////////////////
// Register the Interface.
///////////////////////////
const TCHAR szIf[] = _T("{E1E3EDF7-48D1-11D2-B22B-0000F87A6B50}");
hr = RegSetValueEx( hKey, _T("Interfaces"), 0, REG_BINARY, (const BYTE *) szIf, sizeof(szIf) );
RegCloseKey(hKey);
return S_OK;
}