共用方式為


ActiveDir 範例

這個範例示範如何調整 Managed 物件的預設 Apartment 設定值,此 Managed 物件會將資料傳遞至呼叫 CoInitialize 方法的 Unmanaged 方法。 CoInitialize 方法會在單一執行緒 Apartment (STA) 中初始化 COM 程式庫。 根據預設,C# 用戶端會在多執行緒 Apartment (MTA) 中初始化。 Visual Basic 2005 用戶端會初始化為 STA 物件,而且不需要進行調整。

ActiveDir 範例使用下列 Unmanaged 方法,顯示其原始函式宣告:

  • 從 Dsuiext.dll 匯出 DsBrowseForContainer

    int DsBrowseForContainer(PDSBROWSEINFO pInfo);
    

在 C# 中,STAThreadAttribute 屬性會建立 STA Apartment。 因為 STA 是 Visual Basic 2005 用戶端的預設 Apartment 設定,所以不需要屬性。 Marshal.SizeOf 方法會動態地計算 Unmanaged 結構的大小。

宣告原型

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)> _
Public Structure DsBrowseInfo
    Public Const MAX_PATH As Integer = 256

    Public Size As Integer
    Public OwnerHandle As IntPtr
    Public Caption As String
    Public Title As String
    Public Root As String
    Public Path As String
    Public PathSize As Integer
    Public Flags As Integer
    Public Callback As IntPtr
    Public Param As Integer
    Public ReturnFormat As Integer
    Public UserName As String
    Public Password As String
    Public ObjectClass As String
    Public ObjectClassSize As Integer
End Structure

Public Class LibWrap
    ' Declares a managed prototype for the unmanaged function.
    Declare Unicode Function DsBrowseForContainerW Lib "dsuiext.dll" ( _
        ByRef info As DSBrowseInfo ) As Integer

    Public Const DSBI_ENTIREDIRECTORY As Integer = &H90000
    Public Const ADS_FORMAT_WINDOWS As Integer = 1
    Public Enum BrowseStatus
        BrowseError = -1
        BrowseOk = 1
        BrowseCancel = 2
    End Enum
End Class
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)]
public struct DsBrowseInfo
{
    public const int MAX_PATH = 256;

    public int       Size;
    public IntPtr    OwnerHandle;
    public string    Caption;
    public string    Title;
    public string    Root;
    public string    Path;
    public int       PathSize;
    public int       Flags;
    public IntPtr    Callback;
    public int       Param;
    public int       ReturnFormat;
    public string    UserName;
    public string    Password;
    public string    ObjectClass;
    public int       ObjectClassSize;
}

public class LibWrap
{
    // Declares a managed prototype for the unmanaged function.
    [DllImport("dsuiext.dll", CharSet=CharSet.Unicode)]
    public static extern int DsBrowseForContainerW(ref DsBrowseInfo info);

    public const int DSBI_ENTIREDIRECTORY = 0x00090000;
    public const int ADS_FORMAT_WINDOWS = 1;
    public enum BrowseStatus
    {
        BrowseError = -1,
        BrowseOk = 1,
        BrowseCancel = 2
    }
}
[StructLayout(LayoutKind::Sequential, CharSet=CharSet::Unicode)]
public value struct DsBrowseInfo
{
public:
    static int MAX_PATH = 256;

    int        Size;
    IntPtr     OwnerHandle;
    String^    Caption;
    String^    Title;
    String^    Root;
    String^    Path;
    int        PathSize;
    int        Flags;
    IntPtr     Callback;
    int        Param;
    int        ReturnFormat;
    String^    UserName;
    String^    Password;
    String^    ObjectClass;
    int        ObjectClassSize;
};

public ref class LibWrap
{
public:
    // Declares a managed prototype for the unmanaged function.
    [DllImport("dsuiext.dll", CharSet=CharSet::Unicode)]
    static int DsBrowseForContainerW(DsBrowseInfo^ info);

    static int DSBI_ENTIREDIRECTORY = 0x00090000;
    static int ADS_FORMAT_WINDOWS = 1;
    enum class BrowseStatus
    {
        BrowseError = -1,
        BrowseOk = 1,
        BrowseCancel = 2
    };
};

呼叫函式

Public Class App
    ' Must be marked as STA because the default is MTA.
    ' DsBrowseForContainerW calls CoInitialize, which initializes the
    ' COM library as STA.
    <STAThread> _
    Public Shared Sub Main()
        Dim dsbi As New DsBrowseInfo()

        dsbi.Size = Marshal.SizeOf(GetType(DsBrowseInfo))
        dsbi.PathSize = DsBrowseInfo.MAX_PATH
        dsbi.Caption = "Container Selection Example"
        dsbi.Title = "Select a container from the list."
        dsbi.ReturnFormat = LibWrap.ADS_FORMAT_WINDOWS
        dsbi.Flags = LibWrap.DSBI_ENTIREDIRECTORY
        dsbi.Root = "LDAP:"
        dsbi.Path = New String(New Char(DsBrowseInfo.MAX_PATH){})
        ' Initialize remaining members...

        Dim status As Integer = LibWrap.DsBrowseForContainerW(dsbi)
        if CType(status, LibWrap.BrowseStatus) = LibWrap.BrowseStatus.BrowseOk Then
            Console.WriteLine(dsbi.Path)
        Else
            Console.WriteLine("No path returned.")
        End If
    End Sub
End Class
class App
{
    // Must be marked as STA because the default is MTA.
    // DsBrowseForContainerW calls CoInitialize, which initializes the
    // COM library as STA.
    [STAThread]
    public static void Main()
    {
        DsBrowseInfo dsbi = new DsBrowseInfo();

        dsbi.Size = Marshal.SizeOf(typeof(DsBrowseInfo));
        dsbi.PathSize = DsBrowseInfo.MAX_PATH;
        dsbi.Caption = "Container Selection Example";
        dsbi.Title = "Select a container from the list.";
        dsbi.ReturnFormat = LibWrap.ADS_FORMAT_WINDOWS;
        dsbi.Flags = LibWrap.DSBI_ENTIREDIRECTORY;
        dsbi.Root = "LDAP:";
        dsbi.Path = new string(new char[DsBrowseInfo.MAX_PATH]);
        // Initialize remaining members...

        int status = LibWrap.DsBrowseForContainerW(ref dsbi);
        if ((LibWrap.BrowseStatus)status == LibWrap.BrowseStatus.BrowseOk)
        {
            Console.WriteLine(dsbi.Path);
        }
        else
        {
            Console.WriteLine("No path returned.");
        }
    }
}
public ref class App
{
public:
    // Must be marked as STA because the default is MTA.
    // DsBrowseForContainerW calls CoInitialize, which initializes the
    // COM library as STA.
    [STAThread]
    static void Main()
    {
        DsBrowseInfo dsbi;

        // Initialize the fields.
        dsbi.Size = Marshal::SizeOf(DsBrowseInfo::typeid);
        dsbi.PathSize = DsBrowseInfo::MAX_PATH;
        dsbi.Caption = "Container Selection Example";
        dsbi.Title = "Select a container from the list.";
        dsbi.ReturnFormat = LibWrap::ADS_FORMAT_WINDOWS;
        dsbi.Flags = LibWrap::DSBI_ENTIREDIRECTORY;
        dsbi.Root = "LDAP:";
        dsbi.Path = gcnew String(gcnew array<Char>(DsBrowseInfo::MAX_PATH));
        // Initialize remaining members...

        int status = LibWrap::DsBrowseForContainerW(dsbi);
        if ((LibWrap::BrowseStatus)status == LibWrap::BrowseStatus::BrowseOk)
        {
            Console::WriteLine(dsbi.Path);
        }
        else
        {
            Console::WriteLine("No path returned.");
        }
    }
};

請參閱

概念

其他封送處理範例

平台叫用資料型別

在 Managed 程式碼中建立原型