One error in my code;
The parameter resume_handle is in/out => ref not out like in my code;

> -----Original Message-----
> From: dotnet discussion [mailto:[EMAIL PROTECTED]]On Behalf Of
> Powell, Simon
> Sent: Monday, May 20, 2002 2:11 PM
> To: [EMAIL PROTECTED]
> Subject: Re: [DOTNET] .NET and using APIs
>
>
> Thank you. The attachment was great. Have used code and it works
> perfectly.
>
> Simon Powell
> Dresdner Kleinwort Wasserstein
>
> -----Original Message-----
> From: Dumitru Sbenghe [mailto:[EMAIL PROTECTED]]
> Sent: 20 May 2002 11:32
> To: [EMAIL PROTECTED]
> Subject: Re: [DOTNET] .NET and using APIs
>
>
> Some mistakes in your code
>
> >                 [DllImport("netapi32.dll", CharSet=CharSet.Auto)]
> >                 static extern int NetWkstaUserEnum(StringBuilder
> > servername,
> >                         int level,
> >                         ref int bufptr,
> >                         int prefmaxlen,
> >             ref int entriesread,
> >                         ref int totalentries,
> >                         ref int resume_handle);
>
> The ref params are out params
>
>                 [DllImport("netapi32.dll", CharSet=CharSet.Auto)]
>                 static extern int NetWkstaUserEnum(StringBuilder
> servername,
>                         int level,
>                         out IntPtr bufptr,
>                         int prefmaxlen,
>                         out int entriesread,
>                         out int totalentries,
>                         out int resume_handle);
>
>
> >                 [StructLayout(LayoutKind.Sequential)]
> >                         public struct WKSTA_USER_INFO_1
> >                 {
> >                         public int wkui1_username;
> >                         public int wkui1_logon_domain;
> >                         public int wkui1_oth_domains;
> >                         public int wkui1_logon_server;
> >                 }
>
>
> The struct declaration is
>
>                 [StructLayout(LayoutKind.Sequential)]
>                 public struct WKSTA_USER_INFO_1
>                 {
>                         [MarshalAs(UnmanagedType.LPWStr)]
>                         public string wkui1_username;
>                         [MarshalAs(UnmanagedType.LPWStr)]
>                         public string wkui1_logon_domain;
>                         [MarshalAs(UnmanagedType.LPWStr)]
>                         public string wkui1_oth_domains;
>                         [MarshalAs(UnmanagedType.LPWStr)]
>                         public string wkui1_logon_server;
>                 }
>
> Why int if you know is a LPWSTR?
>
> typedef struct _WKSTA_USER_INFO_1 {
>   LPWSTR    wkui1_username;
>   LPWSTR    wkui1_logon_domain;
>   LPWSTR    wkui1_oth_domains;
>   LPWSTR    wkui1_logon_server;
> }WKSTA_USER_INFO_1,
>
> And the call and looping
>
>
> nStructSize = Marshal.SizeOf(wui1);
> System.Type typeOfStruct = typeof(WKSTA_USER_INFO_1);
>
> do
> {
>         nStatus = NetWkstaUserEnum(
>                         strServer,
>                         1,
>                         out bufptr,
>                         MAX_PREFERRED_LENGTH,
>                         out dwEntriesread,
>                         out dwTotalentries,
>                         out dwResumehandle
>                         );
>         //
>         // If the call succeeds,
>         //
>         if ( (nStatus == NERR_SUCCESS) | (nStatus == ERROR_MORE_DATA) )
>         {
>                 if (dwEntriesread > 0)
>                 {
>                         //
>                         // Loop through the entries.
>                         //
>                         for (int i = 0; i < dwEntriesread; i++)
>                         {
>                                 // Marshal.PtrToStructure((System.IntPtr)
> bufptr, wui1);
>                                 wui1 =
> (WKSTA_USER_INFO_1)Marshal.PtrToStructure(bufptr, typeOfStruct);
> // marshal
> struct pointer to struct; the second parameter is a System.Type,
> which must
> denote the type of the structure
>                                 Console.WriteLine(wui1.wkui1_username +
> wui1.wkui1_logon_domain);
>                                 bufptr = (IntPtr)(bufptr.ToInt32() +
> nStructSize); // inc the pointer to struct array
>                         }
>                 }
>                 else
>                 {
>                         Console.WriteLine("A system error has
> occurred : " +
> nStatus);
>                 }
>         }
> }
> while(nStatus == ERROR_MORE_DATA);
>
> You have attached a full console class.
>
> Dumitru Sbenghe
> http://www.dsbenghe.home.ro/
>
> > -----Original Message-----
> > From: dotnet discussion [mailto:[EMAIL PROTECTED]]On Behalf
> > Of Powell, Simon
> > Sent: Monday, May 20, 2002 11:02 AM
> > To: [EMAIL PROTECTED]
> > Subject: [DOTNET] .NET and using APIs
> >
> >
> > I'm trying to use various APIs with C#, in particular using APIs that
> > return structs and make use of pointers such as LPBYTE, LPDWORD etc.
> > In particular
> > I'm trying to use the API NET_API_STATUS NetWkstaUserEnum(LPWSTR
> > servername,
> > DWORD level, LPBYTE *bufptr, DWORD prefmaxlen,       LPDWORD
> entriesread,
> > LPDWORD totalentries, LPDWORD resumehandle );, but having great
> difficulty
> > trying to return the data. Below is some of the code written so far.
> >
> > private void Form1_Load(object sender, System.EventArgs e)
> >                 {
> >                         listView1.Columns.Add("Username", -2,
> > HorizontalAlignment.Left);
> >                         listView1.Columns.Add("Domain", -2,
> > HorizontalAlignment.Left);
> >                         listView1.Columns.Add("Machine", -2,
> > HorizontalAlignment.Left);
> >                         listView1.View = View.Details;
> >
> >                 }
> >
> >                 [DllImport("netapi32.dll", CharSet=CharSet.Auto)]
> >                 static extern int NetWkstaUserEnum(StringBuilder
> > servername,
> >                         int level,
> >                         ref int bufptr,
> >                         int prefmaxlen,
> >             ref int entriesread,
> >                         ref int totalentries,
> >                         ref int resume_handle);
> >
> >                 [DllImport("netapi32.dll")]
> >                 static extern int NetApiBufferFree(int Buffer);
> >
> >                 // for use on Win NT/2000 only
> >                 [StructLayout(LayoutKind.Sequential)]
> >                 public struct WKSTA_USER_INFO_0
> >                 {
> >                         public int wkui0_username;
> >                 }
> >
> >                 [StructLayout(LayoutKind.Sequential)]
> >                         public struct WKSTA_USER_INFO_1
> >                 {
> >                         public int wkui1_username;
> >                         public int wkui1_logon_domain;
> >                         public int wkui1_oth_domains;
> >                         public int wkui1_logon_server;
> >                 }
> >
> >                 private const int MAX_PREFERRED_LENGTH = -1;
> >                 private const int NERR_SUCCESS = 0x0;
> >                 private const int ERROR_MORE_DATA = 0x234;
> >
> >
> >                 private void button1_Click(object sender,
> > System.EventArgs
> > e)
> >                 {
> >                         StringBuilder strServer = new
> > StringBuilder(textBox1.Text);
> >                         int bufptr = 0;
> >                         int dwEntriesread = 0;
> >                         int dwTotalentries = 0;
> >                         int dwResumehandle = 0;
> >                         int nStatus;
> >                         int nStructSize;
> >
> >                         WKSTA_USER_INFO_1 wui1 = new
> > WKSTA_USER_INFO_1();
> >
> >                         this.listView1.Items.Clear();
> >
> >                         do
> >                         {
> >                                 nStatus = NetWkstaUserEnum(
> >                                         strServer,
> >                                         1,
> >                                         ref bufptr,
> >                                         MAX_PREFERRED_LENGTH,
> >                                         ref dwEntriesread,
> >                                         ref dwTotalentries,
> >                                         ref dwResumehandle
> >                                 );
> >
> >                                 //
> >                                 // If the call succeeds,
> >                                 //
> >                                 if ((nStatus == NERR_SUCCESS) |
> > (nStatus ==
> > ERROR_MORE_DATA))
> >                                 {
> >                                         if (dwEntriesread > 0)
> >                                         {
> >                                                 //
> >                                                 // Loop through the
> > entries.
> >                                                 //
> >                                                 for (int i = 0; (i <
> > dwEntriesread); i++)
> >                                                 {
> >                                                         nStructSize =
> > Marshal.SizeOf(wui1);
> >
> > Marshal.PtrToStructure((System.IntPtr) bufptr, wui1);
> >
> > MessageBox.Show(wui1.wkui1_username);
> >
> >                                                 }
> >                                         }
> >                                         else
> >                                         {
> >                                                 MessageBox.Show("A
> > system error has occurred : " + nStatus);
> >
> >                                         }
> >                                 }
> >
> >
> >                         }
> >                         while(nStatus == ERROR_MORE_DATA);
> >
> >                         NetApiBufferFree(bufptr);
> >
> >
> >                 }
> >
> >                 }
> >
> > I tried to use the platform documentation as template, but failed
> > miserably. If anyone can help or point me in the direction of a good
> > book it would be much appreciated.
> >
> > Simon
> >
>
>
> ----------------------------------------------------------------------
> If you have received this e-mail in error or wish to read our e-mail
> disclaimer statement and monitoring policy, please refer to
> http://www.drkw.com/disc/email/ or contact the sender.
> ----------------------------------------------------------------------
>
> You can read messages from the DOTNET archive, unsubscribe from DOTNET, or
> subscribe to other DevelopMentor lists at http://discuss.develop.com.

You can read messages from the DOTNET archive, unsubscribe from DOTNET, or
subscribe to other DevelopMentor lists at http://discuss.develop.com.

Reply via email to