이 샘플에서는 CoInitialize 메서드를 호출하는 관리되지 않는 메서드로 데이터를 전달하는 관리되는 개체의 기본 아파트 설정을 조정하는 방법을 보여 줍니다. CoInitialize 메서드는 STA(단일 스레드 아파트)에서 COM 라이브러리를 초기화합니다. 기본적으로 C# 클라이언트는 MTA(다중 스레드 아파트)에서 초기화됩니다. Visual Basic 2005 클라이언트는 STA 개체로 초기화되므로 조정이 필요하지 않습니다.
ActiveDir 샘플에서는 다음의 관리되지 않는 메서드를 사용합니다. 이 메서드는 원래의 함수 선언과 함께 표시되어 있습니다.
Dsuiext.dll에서 내보낸 DsBrowseForContainer
int DsBrowseForContainer(PDSBROWSEINFO pInfo);
C#에서는 STAThreadAttribute 특성이 STA 아파트를 만듭니다. STA는 Visual Basic 2005 클라이언트에 대한 기본 아파트 설정이므로 특성이 필요하지 않습니다. Marshal.SizeOf 메서드는 관리되지 않는 구조체의 크기를 동적으로 계산합니다.
프로토타입 선언
<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.");
}
}
};