Foros del Web » Programación para mayores de 30 ;) » .NET »

Como APRENDER a trabajar con apis win32.

Estas en el tema de Como APRENDER a trabajar con apis win32. en el foro de .NET en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 27/02/2009, 15:35
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 11 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.
  #2 (permalink)  
Antiguo 27/02/2009, 15:44
Avatar de Peterpay
Colaborador
 
Fecha de Ingreso: septiembre-2007
Ubicación: San Francisco, United States
Mensajes: 3.858
Antigüedad: 16 años, 8 meses
Puntos: 87
Respuesta: Como APRENDER a trabajar con apis win32.

bueno hace tiempo hubiese sido un reto loquisimo, pero ahora con tantas fuentes de datos solo basta darle una vueltat

http://www.pinvoke.net/

a encontrar los metods del api categorizados por funcion o entorno y como mapearlos a .net
PD: charlie tampoco es nada del otro mundo , pero eso si cabe mencionar que el codigo es limpio y el hecho de usar el atributo flags para poder mapear las posibles combinaciones de la enumeracion es fabuloso.

PD: Aunque cabe mencionar que por el amplio conocimeinto que demuestra al usar el framework, seguramente se debe a años de programar en c++.
__________________
Curso WF4
http://cursos.gurudotnet.com/ DF
Aprende HTML5

Última edición por Peterpay; 27/02/2009 a las 16:11
  #3 (permalink)  
Antiguo 27/02/2009, 17:11
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 11 meses
Puntos: 7
Respuesta: Como APRENDER a trabajar con apis win32.

Muchas gracias por la dirección. Tiene una pinta deliciosa... (Sé que suena a friki, jejeje).

MUCHÍSIMAS GRACIAS PETER !!! jejeje. Creo que era justo lo que necesitaba.

Saludos desde spain.
__________________
Charlie.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:46.