Ver Mensaje Individual
  #1 (permalink)  
Antiguo 27/02/2009, 15:35
chcma
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 21 años, 9 meses
Puntos: 7
Como APRENDER a trabajar con apis win32.

Buenas foreros !!!

Bueno.. sé que el título es un poco "raro", pero es tal cual lo que necesito. Agradecería a cualquier experto en materia de apis y de conocimientos en .NET me de nociones de como aprender a trabajar con ellas.

Para ello, expongo el siguiente caso, en el que me he visto envuelto y lo he solucionado gracias a las APIS:

Necesitaba recorrer las carpetas compartidas de los equipos de red de mi red(valga la redundancia), para ello vi un código en codeproject, del cual he usado la gran parte:

Código:
    public class ClsCarpetas
    {

        [DllImport("netapi32", CharSet = CharSet.Unicode)]
        protected static extern int NetShareEnum(string lpServerName, int dwLevel,
                                                out IntPtr lpBuffer, int dwPrefMaxLen,
                                                out int entriesRead, out int totalEntries,
                                                ref int hResume);


        [Flags]
        public enum ShareType
        {
            /// <summary>Disk share</summary>
            Disk = 0,
            /// <summary>Printer share</summary>
            Printer = 1,
            /// <summary>Device share</summary>
            Device = 2,
            /// <summary>IPC share</summary>
            IPC = 3,
            /// <summary>Special share</summary>
            Special = -2147483648, // 0x80000000,
        }

        /// <summary>Share information, NT, level 2</summary>
        /// <remarks>
        /// Requires admin rights to work. 
        /// </remarks>
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
        protected struct SHARE_INFO
        {
            [MarshalAs(UnmanagedType.LPWStr)]
            public string NetName;
            public ShareType ShareType;
            [MarshalAs(UnmanagedType.LPWStr)]
            public string Remark;
            public int Permissions;
            public int MaxUsers;
            public int CurrentUsers;
            [MarshalAs(UnmanagedType.LPWStr)]
            public string Path;
            [MarshalAs(UnmanagedType.LPWStr)]
            public string Password;
        }


        private List<string> ListaDirectorios = new List<string>();
        public void GetCarpetas(string direccionEquipo)
        {

            int level = 2;
            int entriesRead, totalEntries, nRet, hResume = 0;
            IntPtr pBuffer = IntPtr.Zero;

            nRet = NetShareEnum(direccionEquipo, level, out pBuffer, -1, out entriesRead,
                                out totalEntries, ref hResume);


            if (nRet == 0 && entriesRead > 0)
            {
                int offset = Marshal.SizeOf(typeof(SHARE_INFO));
                for (int i = 0, lpItem = pBuffer.ToInt32(); i < entriesRead; i++, lpItem += offset)
                {

                    IntPtr pItem = new IntPtr(lpItem);
                    SHARE_INFO si = (SHARE_INFO)Marshal.PtrToStructure(pItem, typeof(SHARE_INFO));

                    if (si.ShareType == ShareType.Disk)
                    {

                        string direccionCarpeta = string.Format(@"\\{0]\{1}", direccionEquipo, si.NetName);
                        ListaDirectorios.Add(direccionCarpeta);
                        GetSubDirectorios(direccionCarpeta);
                        //string[] listaDirectorios = Directory.GetDirectories(@"\\192.168.1.138\");
                    }
                }
            }
        }


        private void GetSubDirectorios(string pathDirectorio)
        {

            string[] directoriosEncontrados = Directory.GetDirectories(pathDirectorio);
            if (directoriosEncontrados.Length > 0)
            {

                foreach(string rutaDirectorio in directoriosEncontrados)
                {

                    ListaDirectorios.Add(rutaDirectorio);
                    GetSubDirectorios(rutaDirectorio);
                }
            }
        }
    }
Bueno, pues como podeis ver, toda la parte de arriba (Menos los dos últimos métodos) los copié de CodeProject.

Y en fin, querría saber, como cojones hizo el chico que lo hizo, para saber que tenía que crear:
- El método NetShareEnum.
- La enumeración ShareType y con el atributo [Flags]
- La structura SHARE_INFO

La importación de la DLL netapi32 entiendo que buscando por google te pueda salir, pero... ¿Como cojones pudo saber como crear esas enumeraciones, structuras y demás?

Bueno, agradecería, desde mi humilde postura, pudieran decirme como puedo aprender a manejarme solo con este tema...

Gracias y espero haberme explicado en mi necesidad.

Saludos.
__________________
Charlie.