Interoperabilidad con código no administrado
|
|
|
- Ana Belén Carla Correa de la Fuente
- hace 8 años
- Vistas:
Transcripción
1 dnm.inicio.fundamentos dnm.incio.fundamentos Guillermo Guille Som Interoperabilidad con código no administrado En este artículo nos centraremos en la interoperabilidad con código no administrado (unmanaged code), que es la que nos permitirá usar funciones declaradas en librerías escritas con lenguajes que no pertenecen a la plataforma.net, (por ejemplo funciones del API de Windows), desde un lenguaje que usa el código administrado de.net Framework. << Guillermo Guille Som es Microsoft MVP de Visual Basic desde Es redactor de dotnetmanía, miembro de Ineta Speakers Bureau Latin America, mentor de Solid Quality Learning Iberoamérica y autor del libro Manual Imprescindible de Visual Basic.NET. Interoperabilidad con código no administrado mediante invocación de plataforma (PInvoke) Como comentábamos en el número anterior de dotnetmanía, existen dos formas de utilizar código no administrado desde los lenguajes de.net, es decir, usar código que no está escrito con un lenguaje que se ciñe a las normas impuestas por.net Framework, una de ellas es la interoperabilidad COM, de la que nos ocuparemos próximamente en otro artículo, y la otra forma es mediante la invocación de plataforma, PInvoke o Platform Invoke, esta última es la que veremos a lo largo de este artículo Declaración de las funciones no administradas para usar desde.net Para poder acceder a las funciones no administradas desde el código de nuestro lenguaje de.net debemos usar el atributo DllImport, este atributo está definido en el espacio de nombres Aunque sea casi una constante en cada uno de los artículos de esta sección, vuelvo a aclarar que el código mostrado en el artículo es en C#, pero que el de VB se puede conseguir en el ZIP de código que acompaña a estos artículos,aunque en este caso la aclaración es más necesaria que en otras ocasiones, por qué? porque la forma que tiene VB de utilizar las funciones de código no administrado almacenadas en librerías del API de Windows es totalmente diferente a como lo tiene que hacer C#, diferente y más simple, pero como Visual Basic también permite que utilicemos la forma en que C# debe hacerlo, no será complicado convertir el código mostrado. En el caso de las funciones del API que necesitan trabajar con punteros a funciones (métodos) de.net, siempre tendremos que usar delegados, aunque desde VB la indicación de que usamos ese delegado es diferente a C#, (hay que usar AddressOf), será fácilmente comprensible. System.Runtime.InteropServices, por tanto, o bien debemos realizar una importación de ese espacio de nombres o bien debemos indicarlo delante de este atributo. La forma más básica de usar este atributo es indicando la librería (DLL) en la que se encuentra la función a la que queremos acceder y el nombre de la función en cuestión, por ejemplo, para acceder a la función SendMessage del API de Windows, lo podemos hacer de esta forma: [DllImport( user32.dll, EntryPoint = SendMessage )] private extern static void SendMessage( IntPtr hwnd, int wmsg, int wparam, int lparam Como vemos el nombre de la función que queremos usar la indicamos mediante la propiedad EntryPoint del atributo DllImport, a continuación declaramos la función como extern y static, esto siempre debe ser así, extern lo usamos para indicar al compilador de C# que es una función que está declarada externamente a nuestro código; por otro lado, el uso de static es porque todas las decla- 35
2 raciones de funciones no administradas deben estar declaradas como compartidas, por tanto no serán funciones de instancia, sino que pertenecen a la propia clase que las declara. NOTA El uso del atributo EntryPint es totalmente opcional, al menos si en la definición de la función usamos el mismo nombre que está definido como punto de [entrada de esa función del API] La declaración de la función en realidad es lo que se conoce como un prototipo de función, es decir, no contiene código ejecutable, ya que ese código está en la librería que contiene la función. Esa declaración (o definición) debe incluir los parámetros adecuados que la función original ha definido. Por tanto, la mejor práctica para usar este tipo de funciones no manejadas es buscar la definición en la documentación del SDK de la plataforma (platform SDK) el cual se incluye con la documentación de Visual Studio, en dicha documentación veremos la definición en C de la función y los tipos de parámetros que define, por ejemplo, la función SendMessage está definida de esta forma: LRESULT SendMessage( HWND hwnd, // handle of destination window UINT Msg, // message to send WPARAM wparam, // first message parameter LPARAM lparam // second message parameter 36 Como podemos apreciar en la definición original se usan los tipos UINT, WPA- RAM y LPARAM que hemos traducido como int, incluso el tipo HWND también lo podríamos haber definido como int, esto en realidad no es importante, ya que lo que debemos tener en cuenta es que esos tipos en realidad son valores de 32 bits, por tanto cualquier tipo de 32 bits sería válido. También podemos apreciar que la definición de esta función devuelve un valor del tipo LRESULT, este valor devuelto, según qué mensajes nos puede interesar, en otros no tanto, si no queremos usar el valor devuelto por una función del API la podemos definir como hemos visto en nuestro ejemplo, usando void, de esta forma, no tendremos en cuenta el valor devuelto, pero en los casos que nos interese saber el valor devuelto, podemos usar cualquier tipo de 32 bits, por ejemplo, SendMessage puede devolver un valor verdadero si todo fue bien, en ese caso podemos definirla como de tipo int o bool. En la tabla 1 podemos ver algunos de los tipos definidos en el API de Windows y los equivalentes en.net. Tipo del API Descripción Equivalencia en.net HWND Handle de la ventana de destino Int32 o System.IntPtr WORD Entero de 16 bits sin signo UInt16 o Int16 DWORD Entero de 32 bit sin signo UInt32 o Int32 BOOL Entero, (0 ó 1) Boolean o Int32 UINT Entero sin signo Int32 o UInt32 WPARAM Cuando se usa en Send/PeekMessage,el primer parámetro del mensaje Int32 LPARAM El segundo parámetro del mensaje Int32 LPCTSTR Dirección de una cadena (no modificable) String o StringBuilder LPTSTR Dirección de una cadena (modificable) String o StringBuilder LPMSG Puntero a una estructura del tipo MSG Estructura CALLBACK Definición de la función CallBack Delegate Algunos de los tipos del API mostrados en esta tabla, permiten que utilicemos indistintamente un tipo de datos u otro, por ejemplo, UINT en realidad es un tipo unsigned int de C, pero salvo que queramos pasar un valor entero positivo mayor del permitido por Int32 (Int32.Maxvalue), podemos usar cualquiera de los dos tipos, ya que en realidad, a la función de C lo que le importa es que sea un tipo de 32 bits, al menos en las plataformas de 32 bits, ya que en las plataformas de 64 bits, esperará un entero de 64 bits, porque el tipo int de C depende de la plataforma, (y/o del compilador), a diferencia del tipo long que siempre será un entero de 32 bits, trabajemos en la plataforma que trabajemos. ] NOTA En.NET los tipos de datos siempre son de tamaño fijo independientemente de la plataforma en que se usen, a excepción de IntPtr y UIntPtr que dependen de la plataforma, por tanto en plataformas de 32 bits serán de 32 bits y en pla- [taformas de 64 serán de 64 bits. Tabla 1. Equivalencias de tipos del API con.net Funciones que envían cadenas al API La función SendMessage es precisamente una de las funciones más versátiles del API de Windows, precisamente como se usa para enviar mensajes a las ventanas, estos pueden ser de tipos muy distintos, y precisamente por esa razón, los parámetros también variarán con frecuencia. Por ejemplo, si queremos a- signar un texto a una ventana usaremos esa función indicando como mensaje WM_SETTEXT, la definición del último parámetro sería de la siguiente forma: // address of window-text string (LPARAM)(LPCTSTR)lpsz; El último parámetro de la función es el que contiene el texto que queremos asignar a la ventana cuyo handle indicamos en el primer parámetro, por tanto debemos modificar la definición de esa función para que pueda enviar el texto. En este caso podemos usar indistintamente un tipo string o StringBuilder, pero si lo que la función hará es obtener un texto, deberíamos usar StringBuilder, en cualquiera de los dos casos debemos rellenarlos con los caracteres suficientes, los que esperamos recibir, por regla general 255 es suficiente.
3 La definición de esta versión de SendMessage quedaría de esta forma: private extern static bool SendMessage( IntPtr hwnd, int wmsg, int wparam, string lparam Funciones que reciben cadenas Veamos ahora una función del API que devuelve una cadena en uno de los parámetros, es la función GetClassName y en la documentación del Platform SDK está definida como: int GetClassName( HWND hwnd, // handle of window LPTSTR lpclassname, // address of buffer for class name int nmaxcount // size of buffer, in characters En el segundo parámetro indicamos la variable que recibirá el nombre de la clase, y en el último debemos indicar el tamaño de ese buffer, el cual debe ser suficientemente grande para recibir todo el texto, pero como dijimos, con 255 será más que suficiente. Una de las definiciones de esta función puede ser la siguiente: private extern static int GetClassName(IntPtr hwnd, StringBuilder lpclassname, int nmaxcount Y la podemos usar de esta forma: StringBuilder sb = new StringBuilder(new string(, 255) int ret = GetClassName(winHandle, sb, sb.length this.txtclassname.text = sb.tostring().substring(0, ret En el caso de esta función, si el número de caracteres que pasamos como buffer es inferior al valor real del nombre de la clase, no ocurrirá nada malo, simplemente recibiremos los caracteres que hemos indicado, por ejemplo el bloc de notas tiene un nombre de clase llamado Notepad, si en el constructor del StringBuilder hubiésemos indicado 5 en lugar de 255, la cadena devuelta sería Note, sí, sólo 4 caracteres, esto es así porque todas las cadenas de C acaban con un valor \0 que es el que indica el final de la cadena, y como sólo hemos indicado que queremos cinco, recibimos esos cinco, aunque el último no es imprimible. Obtener el handle de una venana Como acabamos de comprobar en los ejemplos que estamos usando siempre necesitamos el handle (o manejador que dicen algunos) de la ventana que queremos manipular. Esas ventanas no tienen porqué ser ventanas en toda regla, sino que también pueden ser controles, ya que para Windows todo son ventanas y todas se pueden manipular si sabemos el handle. Si queremos usar controles o formularios de.net con funciones de Windows, podemos usar la propiedad Handle definida en la clase Control, y que por tanto todos los controles de.net tendrán, incluso los formularios. Precisamente el tipo de esa propiedad es IntPtr, por eso estamos usando ese tipo de datos para los parámetros que reciben ese tipo de información. Pero si en lugar de una ventana administrada queremos usar una de la que no tenemos control directo, por ejemplo una aplicación que esté en ejecución, podemos usar la función FindWindow. Esta función devuelve el handle de una ventana. Para saber que ventana queremos capturar, podemos usar o bien el nombre de la clase o bien el título. Lo más habitual es usando el título, por ejemplo, para saber el handle del bloc de notas, podemos hacerlo de esta forma: Es importante que nos fijemos en la forma en que está definido el objeto StringBuilder que usaremos como argumento receptor del nombre de la clase: Le pasamos al constructor una cadena con 255 caracteres (da igual que sean espacios). Hago esta aclaración porque no sería lo mismo definirlo usando el constructor que le indica la capacidad que tendrá el objeto StringBuilder, ya que esa capacidad no asigna ningún tipo de cadena. La función GetClassName devuelve el número de caracteres que ha asignado a la cadena, por eso usamos ese valor para recuperar la cadena recibida, ya que el StringBuilder seguirá teniendo 255 caracteres, pero sólo nos interesan los ret primeros. IntPtr winhandle = FindWindow(null, Sin título - Bloc de notas El texto indicado debe coincidir exactamente con el del título de la ventana, aunque no se hace distinción entre mayúsculas y minúsculas, salvo en las vocales acentuadas. La definición de esta función sería: private extern static IntPtr FindWindow( string lpclassname, string lpwindowname 37
4 38 Usar estructuras con el API de Windows Otra forma de usar las funciones del API de Windows es mediante estructuras; en estos casos, debemos pasar esas estructuras por referencia, ya que las estructuras pasadas a las funciones del API se pasan como punteros. Por ejemplo la estructura LVFINDIN- FO se utiliza junto con la función SendMessage para buscar elementos de un control ListView, la definición de esta estructura es la siguiente: typedef struct taglvfindinfo UINT flags; LPCTSTR psz; LPARAM lparam; POINT pt; UINT vkdirection; LVFINDINFO, *LPFINDINFO; En C# y de forma simplificada la podemos definir de esta forma: private struct taglvfindinfo public uint flags; public string psz; public int lparam; public int pt; public uint vkdirection; El campo pt en realidad debería ser de tipo POINT (o el equivalente en C#), pero como no lo usaremos y la función espera un puntero, podemos usar un tipo entero. De la misma forma, los campos definidos como uint pueden ser de tipo entero, o en el caso del campo flags, incluso podríamos definir una enumeración y usarla como tipo de datos, con idea de que se usen los valores permitidos en ese campo de la estructura. Esa enumeración podía ser la siguiente: [FlagsAttribute] enum FindItemFlags FullString = 0x02, StartsWith = 0x08, // Busca la cadena completa // Busca la cadena indicada // desde el principio ContSearching = 0x20 // Sigue buscando desde el // principio si no halla nada Si nos decidimos a usar esta enumeración, el primer campo de las estructura deberíamos declararlo así: FindItemFlags flags; Y la definición apropiada de SendMessage para usar este tipo de datos, que como hemos dicho habría que usarlo por referencia, quedaría así: [DllImport( user32.dll, EntryPoint = SendMessage )] private static extern int SendMessage( IntPtr hwnd, int msg, int istart, ref taglvfindinfo plvfi Y la podríamos usar de esta manera: const int LVM_FIRST = 0x1000; const int LVM_FINDITEM = (LVM_FIRST + 13 taglvfindinfo LV_FINDINFO = new taglvfindinfo( LV_FINDINFO.flags = FindItemFlags.StartsWith; LV_FINDINFO.psz = this.txtbuscarlv.text; int index = SendMessage(listView1.Handle, LVM_FINDITEM, -1, ref LV_FINDINFO if(index > -1) listview1.items[index].selected = true; Funciones con devolución de llamada (callback) Este es otro caso que también es común en algunas funciones del API: Usar funciones CallBack (o de devolución de llamadas que es como lo traducen en la documentación de Visual Studio). Este tipo de funciones, en realidad se definen como punteros a funciones y, como sabemos, en.net Framework no existen los punteros, al menos como los de C, la única forma de usar punteros administrados es por medio de los delegados, por tanto, cuando nos encontremos con este tipo de funciones, tendremos que usar delegados. Un ejemplo clásico es la función EnumWindows, esta función está definida de la siguiente forma: BOOL EnumWindows( WNDENUMPROC lpenumfunc, // pointer to callback function LPARAM lparam // application-defined value Por otro lado, el puntero a la función callback está definido de esta forma: BOOL CALLBACK EnumWindowsProc( HWND hwnd, // handle to parent window LPARAM lparam // application-defined value En C#, el puntero a la función lo definimos como un delegado, en este caso será una función que devuelva un valor bool y reciba dos parámetros, el primero para el handle de la ventana y el segundo de tipo entero:
5 private delegate bool EnumWindowsDelegate(IntPtr hwnd, int parametro La declaración de la función EnumWindows usará ese delegado como primer parámetro, quedando definida de esta forma: private extern static bool EnumWindows(EnumWindowsDelegate lpfn, int lparam Esta función lo que hará es enumerar todas las ventanas que actualmente estén funcionando, no tienen porqué ser ventanas físicas, es decir, aplicaciones, sino cualquier ventana que esté actualmente en el sistema, más de las que nos pensamos, como podrás comprobar cuando uses el programa de ejemplo, la forma de enumeración consiste en llamar a la función callback pasándole el handle de cada una de las ventanas que haya, la función será la que se encargue de manejar esa información, que en nuestro caso las iremos asignando a un ListView en el que mostraremos el handle y el título. EnumWindows seguirá llamando a nuestra función mientras haya ventanas que enumerar y reciba un valor verdadero desde nuestra función. Esto último es útil si lo que pretendemos es, por ejemplo, buscar una ventana determinada para saber si está en funcionamiento, y en el caso de que encontremos lo que buscamos, devolvemos false para dejar de recorrer el resto de ventanas. Nuestra función callback podría ser como sigue: private bool EnumWindowsProc(IntPtr hwnd, int parametro) StringBuilder titulo = new StringBuilder( new string(, 256) int ret; string nombreventana; // ret = GetWindowText(hWnd, titulo, titulo.length if(ret == 0) return true; // nombreventana = titulo.tostring().substring(0, ret if(nombreventana!= null && nombreventana.length >0) ListViewItem liv = listview1.items.add(nombreventana liv.subitems.add(hwnd.tostring() // Devolver true para continuar con la enumeración return true; Para poner en marcha la enumeración de ventanas, lo haremos creando un nuevo delegado que pasaremos como valor del primer parámetro del EnumWindows: EnumWindows(new EnumWindowsDelegate(this.EnumWindowsProc), 0 Como sabemos, los delegados simplemente definen prototipos de funciones en los que se especifican los parámetros que dicha función deben definir, esto es lo que hace que los delegados sean más confiables que los punteros de C, ya que si.net detecta que la función que queremos usar, (en el ejemplo anterior la indicada en el constructor del delegado), no coincide con ese prototipo, no nos dejará compilar la aplicación, con lo cual sabemos que la función no se ciñe a los parámetros que debe recibir. La definición de la función GetWindowText que utilizamos para obtener el texto de la ventana indicada por el handle de la ventana la podemos definir de la siguiente forma: private extern static int GetWindowText( IntPtr hwnd, StringBuilder lpstring, int cch En la que volvemos a hacer uso de un tipo StringBuilder, ya que en el segundo parámetro recibiremos el título de esa ventana. La clase Marshal y el atributo MarshalAs (O cómo asegurarnos de pasar los tipos de datos correctos a las funciones del API) Otra forma que podemos usar para definir los tipos usados en las declaraciones de las funciones del API es usando los tipos definidos en la enumeración UnmanagedType, esta enumeración define tipos como LPStr, y podemos usarlo de la siguiente forma: private extern static int GetClassName( IntPtr hwnd, [MarshalAs(UnmanagedType.LPStr)] StringBuilder lpclassname, int nmaxcount El atributo MarshalAs es útil particularmente cuando estamos trabajando con arrays. Por ejemplo, si en una función del API se espera una estructura en el que uno de los campos es un array de bytes de un tamaño específico, podemos usar ese atributo indicando el tipo de datos que esperamos y el tamaño del mismo, por ejemplo la estructura OSVERSIONINFO tiene un campo que es un array de tipo TCHAR (Char de Unicode), veamos la definición de esa estructura en el API de Windows: 39
6 typedef struct _OSVERSIONINFO DWORD dwosversioninfosize; DWORD dwmajorversion; DWORD dwminorversion; DWORD dwbuildnumber; DWORD dwplatformid; TCHAR szcsdversion[ 128 ]; OSVERSIONINFO; En este caso concreto, el valor devuelto en el campo szcsdversion es el Service Pack que tenemos aplicado en nuestro sistema operativo. En C# la definiremos de la siguiente forma: 40 struct OSVERSIONINFO public int dwosversioninfosize; public int dwmajorversion; public int dwminorversion; public int dwbuildnumber; public int dwplatformid; [MarshalAs(UnmanagedType.ByValTStr, SizeConst=128)] public string szcsdversion; La función con la que podemos usar esta estructura es GetVersionEx, a la que pasaremos la estructura por referencia y la declaración la podemos hacer de la siguiente forma: [DllImport( kernel32.dll )] private static extern int GetVersionEx(ref OSVERSIONINFO osinfo Y si queremos que quede constancia de que estamos usando una estructura no administrada, podemos aplicarle el atributo MarshalAs de esta forma: [DllImport( kernel32.dll )] private static extern int etversionex([marshalas(unmanagedtype.struct)] ref OSVERSIONINFO osinfo Como vemos en la definición de la estructura, el primer campo espera el tamaño de dicha estructura, esto también es muy habitual en las estructuras usadas en el API de Windows, ese valor lo podemos obtener también por medio de la clase Marshal, concretamente con el método SizeOf al que le pasaremos como argumento la estructura (o tipo) del que queremos averiguar el tamaño. Por ejemplo para usar esa función, lo haremos de la siguiente forma: OSVERSIONINFO osv = new OSVERSIONINFO( osv.dwosversioninfosize = Marshal.SizeOf(osv int res = GetVersionEx(ref osv if(res!= 0) this.text = OS v + osv.dwmajorversion +. + osv.dwminorversion +. + osv.dwbuildnumber + + osv.szcsdversion; En la figura 1 podemos ver la aplicación de ejemplo para este artículo en plena ejecución. El código de esa aplicación (tanto para VB como para C#) lo puedes obtener desde la Web de dotnetmanía, y está creado con Visual Studio 2005, (los proyectos de VB y C# se pueden usar indistintamente con la versión normal de Visual Studio 2005 o con las versiones Express de cada uno de los lenguajes), además, para aquellos que aún no han instalado la nueva versión de Visual Studio, en esos zips con el código, también se incluyen los proyectos de los dos lenguajes creados con la versión 2003 de Visual Studio, de esa forma nadie tendrá la excusa de no poder probar si todo lo dicho es cierto. Conclusiones Figura 1. La aplicación de ejemplo en modo ejecución. El tema de la interoperabilidad con código no administrado mediante la invocación de plataforma (PInvoke) es mucho más amplio de lo que hemos tratado aquí, por tanto he tenido que resumirlo para mostrar lo que podemos usar en el día a día, ya que prácticamente hemos visto todas las posibilidades que normalmente se nos presentarán cuando queramos acceder a funciones definidas en librerías creadas con C/C++ o con cualquier otro compilador que permita la creación de este tipo de aplicaciones. Por tanto, lo aquí explicado no solo es válido para las librerías incluidas en el sistema operativo, y para demostrarlo en el zip con el código, he incluido una librería (y su código fuente) creada para compilarla con el compilador gratuito de Borland C++ 5.5, además de una aplicación tanto para Visual Basic como para C# que usa dicha DLL. En el próximo artículo veremos la tercera y última parte de esta serie sobre la interoperabilidad, en ese caso será sobre cómo crear componentes de.net que podamos usar como componentes COM.
Interoperabilidad. Yo interopero, tu interoperas,... interoperemos todos!
dnm.inicio.fundamentos dnm.incio.fundamentos Guillermo Guille Som Interoperabilidad Yo interopero, tu interoperas,... interoperemos todos! La interoperabilidad bien entendida hace referencia a cómo utilizar
Relación entre delegados y eventos El avisador que te avise, buen avisador será
dnm.inicio.fundamentos dnm.incio.fundamentos Guillermo Guille Som Relación entre delegados y eventos El avisador que te avise, buen avisador será En el número anterior vimos con detalle casi todo lo concerniente
Parámetros personalizados en los eventos
dnm.inicio.fundamentos dnm.incio.taller Guillermo Guille Som Parámetros personalizados en los eventos En este cuarto artículo dedicado a los delegados y eventos nos centraremos en cómo comunicarnos entre
Usar componentes.net desde aplicaciones COM
dnm.inicio.fundamentos dnm.incio.taller Guillermo Guille Som Usar componentes.net desde aplicaciones COM En este artículo veremos cómo crear componentes en.net que se puedan usar desde aplicaciones que
ESTRUCTURA DE DATOS. Memoria estática Memoria dinámica Tipo puntero Declaración de punteros Gestión de memoria dinámica Resumen ejemplo
ESTRUCTURA DE DATOS Memoria estática Memoria dinámica Tipo puntero Declaración de punteros Gestión de memoria dinámica Resumen ejemplo DATOS ESTÁTICOS Su tamaño y forma es constante durante la ejecución
FUNCIONES JAVASCRIPT. CONCEPTO. PARÁMETROS O ARGUMENTOS Y TIPOS. PASO POR VALOR. RETURN. EJEMPLOS. (CU01122E)
APRENDERAPROGRAMAR.COM FUNCIONES JAVASCRIPT. CONCEPTO. PARÁMETROS O ARGUMENTOS Y TIPOS. PASO POR VALOR. RETURN. EJEMPLOS. (CU01122E) Sección: Cursos Categoría: Tutorial básico del programador web: JavaScript
REPASO ARRAYS O ARREGLOS UNIDIMENSIONALES EN JAVA. EJEMPLOS DE CÓDIGO. (CU00903C)
APRENDERAPROGRAMAR.COM REPASO ARRAYS O ARREGLOS UNIDIMENSIONALES EN JAVA. EJEMPLOS DE CÓDIGO. (CU00903C) Sección: Cursos Categoría: Lenguaje de programación Java nivel avanzado I Fecha revisión: 2039 Resumen:
TEMA 7: Ficheros. TEMA 7: Ficheros. 7.1.-Concepto de fichero
TEMA 7: Ficheros 7.1.-Concepto de fichero Todas las estructuras de datos que hemos visto hasta ahora utilizan memoria principal. Esto tiene dos limitaciones importantes: 1. Los datos desaparecen cuando
TADs en C. Matías Bordese Algoritmos y Estructuras de Datos II - Laboratorio 2013
TADs en C Matías Bordese Algoritmos y Estructuras de Datos II - Laboratorio 2013 1. Objetivos Definición de TADs en C Ocultación de la implementación del TAD Manejo básico de memoria dinámica 2. Usando
IMPORTAR Y USAR CLASES DEL API DE JAVA. EJEMPLO CLASE MATH Y MÉTODO POW. CONSTRUCTORES PRIVADOS. (CU00647B)
APRENDERAPROGRAMAR.COM IMPORTAR Y USAR CLASES DEL API DE JAVA. EJEMPLO CLASE MATH Y MÉTODO POW. CONSTRUCTORES PRIVADOS. (CU00647B) Sección: Cursos Categoría: Curso Aprender programación Java desde cero
Carlos Montenegro. Programación Orientada a Objetos Proyecto Curricular de Ingeniería de Sistemas
2 - Introducción al lenguaje Java, identificadores y comentarios. Carlos Montenegro Programación Orientada a Objetos Proyecto Curricular de Ingeniería de Sistemas 1. Introducción: Java tiene como todos
Algoritmos y Programación Orientada a Objetos I. Contenedoras de tamaño variable y uso de ciclos en otros contextos
Algoritmos y Programación Orientada a Objetos I y uso de ciclos en otros contextos Agenda Motivación Uso de ciclos en otros contextos Agenda Motivación Uso de ciclos en otros contextos Motivación En muchos
Clases y Objetos en C++
Informática II Clases y Objetos en C++ Introducción Las variables de los tipos fundamentales de datos no son suficientes para modelar adecuadamente objetos del mundo real. alto, ancho y longitud para representar
Unidad V. Ya veremos qué poner en "algunas_palabras" y "algo_más", por ahora sigamos un poco más.
Implementación Orientada a Objetos. Unidad V 5.1 Estructura de una clase. Una clase consiste en: algunas_palabras class nombre_de_la_clase [algo_más] { [lista_de_atributos] [lista_de_métodos] Lo que está
Arrays unidimensionales. Dim.Option Base. Erase. Ejemplos en Visual Basic (CU00311A)
aprenderaprogramar.com Arrays unidimensionales. Dim.Option Base. Erase. Ejemplos en Visual Basic (CU00311A) Sección: Cursos Categoría: Curso Visual Basic Nivel I Fecha revisión: 2029 Autor: Mario R. Rancel
Métodos CON valor de retorno
Métodos Estáticos C# Fundamentos de Programación. Objetivos del tema: Qué es un método? Qué métodos conoces? Métodos que NO devuelven valor. Métodos que SI devuelven un valor. Paso de parámetros. Variables
VARIABLES TIPOS FUNDAMENTALES
VARIABLES Una variable es un espacio reservado en el ordenador para contener valores que pueden cambiar durante la ejecución de un programa. Los tipos determinan cómo se manipulará la información contenida
Introducción a Java. Dr. (c) Noé Alejandro Castro Sánchez
Introducción a Java Dr. (c) Noé Alejandro Castro Sánchez Programas Java Applets Pueden correr en navegadores Web Agregan funcionalidad a páginas Web Se llega a restringir su funcionalidad (e. g., no pueden:
Memoria en C++ Punteros - Referencias Clases Y ahora, a trabajar! Memoria Dinámica en C++
Qué es una variable? Variables Memoria Matemática: una etiqueta que representa a un valor en una expresión: f (y) = y 2 + 2y Programación: Nombre simbólico dado a un valor residente en la memoria. Propiedades
Unidad IV. Este tipo de codificación nos es permitido gracias a la sobrecarga, la cual se aplica a métodos y constructores.
Unidad IV Métodos. 4.1 Definición de un método. El polimorfismo, en programación orientada a objetos, se refiere a la posibilidad de acceder a un variado rango de funciones distintas a través del mismo
Variables. Una variable no es más que un nombre simbólico que identifica una dirección de memoria: vs.
Variables Una variable no es más que un nombre simbólico que identifica una dirección de memoria: Suma el contenido de la posición 3001 y la 3002 y lo almacenas en la posición 3003 vs. total = cantidad1
Apunte Laboratorio ALPI - El lenguaje de programación Pascal
Apunte Laboratorio ALPI - El lenguaje de programación Pascal 1 2 ÍNDICE GENERAL Índice 1. Estructura de un Programa en Pascal 3 2. Sintaxis de Pascal 4 2.1. Uso de mayúsculas.....................................
Creando CRUD en PHP: operaciones básicas para la gestión de bases de datos
Creando CRUD en PHP: operaciones básicas para la gestión de bases de datos Cualquier portal web utiliza algún sistema de base de datos para almacenar la información que luego mostrará en sus páginas. Para
plataforma.net Componente de acceso a la tarjeta SIM en Windows Mobile Pinvokando
Javier Garrido plataforma.net Componente de acceso a la tarjeta SIM en Windows Mobile El acceso a la tarjeta SIM en Windows Mobile es poco habitual, principalmente porque cuando se introduce en la PDA,
Práctica 3. Paso de parámetros entre subrutinas. 3. Consideraciones sobre el paso de parámetros
Práctica 3. Paso de parámetros entre subrutinas 1. Objetivo de la práctica El objetivo de esta práctica es que el estudiante se familiarice con la programación en ensamblador y el convenio de paso de parámetros
Tipos Recursivos de Datos
1/1 Tipos Recursivos de Datos Josefina Sierra Santibáñez 27 de noviembre de 2016 2/1 Introducción La recursividad no sólo se puede aplicar a la definición de procedimientos (i.e. funciones o acciones),
Docente: Juan Carlos Pérez P. Alumno : Fecha : Nota:
Docente: Juan Carlos Pérez P. Alumno : Fecha : Nota: Justificación: Se pretende con éste contribuir a que el alumno se inicie y conozca el entorno del IDE en la creación de pequeños programas en java Objetivos:
Estructura de datos y Programación
Estructura de datos y Programación Tema: Conceptos Básicos- Estructuras de control - Arreglos Ing. Analia Méndez Ing. Raquel Zarco Año: 2012 ELEMENTOS DE UN PROGRAMA EN JAVA El programa Java consta de
Programación de Videojuegos Tema 15 Tipos de Dato I. 15. Tipos de Dato I
15. Por ahora ya sabemos lo suficiente sobre el muestreo de textos por pantalla, aunque por supuesto a falta de practicar un poco. Vamos a cambiar un poco de temática y vamos a ver otros aspectos avanzados
Clases y métodos parciales (Guía de programación de C#)
Page 1 of 6 2008 Microsoft Corporation. All rights reserved. Guía de programación de C# Clases y métodos parciales (Guía de programación de C#) Es posible dividir la definición de una clase [ http://msdn.microsoft.com/es-co/library/0b0thckt(printer).aspx
PHP orientado a objetos:
PHP orientado a objetos: La mayoría de los lenguajes de programación modernos son orientados a objetos (abreviado OO) o en su defecto se aproximan mucho a éstos permitiendo algunas de sus características
Lección 2: Creando una Aplicación en Java. 1. Estructura del archivo de una clase. 3. Definiendo clases fundamentos
Lección 2: Creando una Aplicación en Java 1. Estructura del archivo de una clase 2. Usando una clase 3. Definiendo clases fundamentos Objetivos Conocer: La forma en la cual está se está estructurado el
APUNTADORES. Un apuntador es un objeto que apunta a otro objeto. Es decir, una variable cuyo valor es la dirección de memoria de otra variable.
APUNTADORES Un apuntador es un objeto que apunta a otro objeto. Es decir, una variable cuyo valor es la dirección de memoria de otra variable. No hay que confundir una dirección de memoria con el contenido
! Qué es la POO?! Un paradigma de programación. ! No hay paradigmas mejores ni peores! Todos tienen sus ventajas e inconvenientes
Introducción Programación orientada a objetos Curso INEM. Programación en Java Santiago Muelas Pascual [email protected]! Qué es la POO?! Un paradigma de programación! Un paradigma es una forma de afrontar
Delegados y eventos Primera parte: En quién delegas tú?
dnm.inicio.fundamentos dnm.incio.fundamentos Guillermo Guille Som Delegados y eventos Primera parte: En quién delegas tú? En este número vamos a tratar de los delegados,y también de los eventos (aunque
Procesos e Hilos en C
Procesos e Hilos en C 6 de febrero de 2012 En esta sesión vamos a escribir programas en lenguaje C que utilicen hilos y procesos para comparar el rendimiento del sistema ante la gestión de unos y otros.
Estructuras. //identificador del cliente
Estructuras 1 Objetivos Al finalizar esta actividad, serás capaz de: 1. Escribir la declaración de una estructura de datos convenientemente especificada 2. Escribir el código necesario para acceder a un
Funciones Definición de función
Funciones Definición de función Una función es un bloque de código que realiza una tarea específica. Una función es una porción de programa, identificable mediante un nombre, que realiza determinadas tareas
Lección 2 Introducción al lenguaje C
Lección Introducción al lenguaje C Decimal Binario Hexadecimal A B C D E F Octal Equivalencia entre decimal, binario, hexadecimal y octal. Código ASCII (American Standard Code for Information Interchange)
Programación con Visual C#
Programación con Visual C# Duración: 40.00 horas Descripción Visual C# es uno de los lenguajes de programación desarrollados por Microsoft, basado en la programación orientada a objetos. Es imprescindible
Estructuras de Datos Declaraciones Tipos de Datos
Departamento de Informática Universidad Técnica Federico Santa María Estructuras de Datos Declaraciones Tipos de Datos Temas: 2-3-4 IWI-131, paralelo 01 Profesor: Teddy Alfaro O. Lenguaje de Programación
La sintaxis básica para definir una clase es la que a continuación se muestra:
DEFINICIÓN DE CLASES Y OBJETOS EN C# Sintaxis de definición de clases La sintaxis básica para definir una clase es la que a continuación se muestra: class nombreclase miembros De este modo se definiría
TEMA 02 TIPOS, OPERADORES Y EXPRESIONES
TEMA 02 TIPOS, OPERADORES Y EXPRESIONES 2.1.- Introducción. 2.2.- Datos. 2.3.- Entrada y salida básica. 2.4.- Modificadores. 2.5.- Cadenas de caracteres. 2.6.- Operadores. 2.7.- Precedencia de operadores.
Memoria Dinámica. Jornadas de Marzo 2010 Grupo de Usuarios de Linux Tania Pérez
Jornadas de Marzo 2010 Grupo de Usuarios de Linux Tania Pérez 1. PUNTEROS 2. MEMORIA DINÁMICA 2 1. PUNTEROS 3 Qué es un puntero? Un tipo de variable cuyo valor es la dirección de memoria de otra variable.
Introducción a C# y la plataforma.net
Introducción a y la plataforma.net Matías Malbergier 2013 Plataforma.NET.NET provee un set de herramientas (Framework) el cual permite desarrollar programas apuntando a múltiples plataformas y utilizando
fundamentos Cifrar y descifrar datos
Guillermo «Guille» Som fundamentos Criptografía práctica El encriptador que lo encripte... debe guardar las claves El desencriptador que lo desencripte... debe conocer las claves La criptografía nos permite
FUNDAMENTOS DE INFORMÁTICA
FUNDAMENTOS DE INFORMÁTICA Tema 1 Introducción a la Programación en Visual Basic Departamento de Ingeniería de Sistemas y Automática Universidad de Vigo undamentos de Informática. Departamento de Ingeniería
Para crear un arreglo de cualquier tipo de elementos la sintaxis es:
Arreglos (arrays) Un arreglo es una estructura de datos homogénea o conjunto de elementos del mismo tipo. En Java se pueden manejar arreglos de elementos de tipo primitivo (8 tipos primitivos hay en Java)
abril de 2017 Desarrollo de aplicaciones en Java Tipos de datos primitivos Tipos de datos Elementos de aplicaciones simples
Desarrollo de aplicaciones en Java Generación de código fuente Compilación Ejecución Elementos de aplicaciones simples EII147-01-02 Introducción a las tecnologías de información Escuela de Ingeniería Industrial
Informática PRÀCTICA 9 Curs Práctica Nº 9: Rango y precisión de representación de números en el ordenador.
Departamento de Práctica Nº 9: Rango y precisión de representación de números en el ordenador. Uso de punteros Objetivos de la práctica: - Entender la representación de números (enteros y reales) en el
Objetivo de aprendizaje del tema
Computación II Tema 3. Identificadores, palabras clave y tipos de datos Objetivo de aprendizaje del tema Al finalizar el tema serás capaz de: Distinguir i entre modificadores d válidos y no válidos. Enumerar
Algoritmos y Programación I
Algoritmos y Programación I ARREGLOS Y ESTRUCTURAS EN C Arreglos Un arreglo o vector es un conjunto de datos del mismo tipo, almacenados de forma contigua (es decir uno al lado del otro) en memoria principal.
Introducción a C++ y Code::Blocks
Introducción a C++ y Práctica Imperativo Clase 1 Luis Agustín Nieto Departamento de Computación, FCEyN,Universidad de Buenos Aires. 28 de mayo de 2010 Menu de esta Tarde Funcional Vs. Imperativo (Intérprete
UNIVERSIDAD NACIONAL DE TRUJILLO ESCUELA DE INFORMATICA SWI PROLOG
ESCUELA DE INFORMATICA Interfaces Graficas Gustavo Alexander Alvarez Alvarez 2 1. INSTALAR Si aun no instalas el SWI Prolog en tu PC, descárgalo desde su Portal Web: http://www.swiprolog.org/index.html
Tema 5 Tabla de Símbolos
Traductores, Compiladores e Intérpretes 1 Tema 5 También se la llama tabla de nombres o tabla de identificadores y tiene dos funciones principales: - Efectuar chequeos semánticos. - Generación de código.
Tutorial de c++ grafico por BlackShadow7777
Tutorial de c++ grafico por BlackShadow7777 Vamos a aprender como hacer una ventana en c++ sin muchos rollos: Seleccionas nuevo proyecto y allí win32 aplicación Luego en las selecciones que dicen: An Empty
Programación Orientada a Objetos en C++
Unidad I Programación Orientada a Objetos en C++ Programación Orientada a Objetos en C++ Programación I - 0416202 Contenido Esta lección abarca los siguientes temas: Estructura y declaración de una clase
Elementos de un programa en C
Elementos de un programa en C Un programa en C consta de uno o más archivos. Un archivo es traducido en diferentes fases. La primera fase es el preprocesado, que realiza la inclusión de archivos y la sustitución
Tema 2: Programación basada en Objetos
Tema 2: Programación basada en Objetos Programación Orientada a Objetos Marcos López Sanz Máster en Informática Gráfica, Juegos y Realidad Virtual Índice Objetivos Introducción Vista Pública Clases Objetos
HOJA DE EJERCICIOS 3 HERENCIA ENTRE CLASES Y POLIMORFISMO DE MÉTODOS
Estructura de la Información en Programación I.T.I.G., Matemáticas. Curso 2009/2010 Nombre:... Fecha: / 11 / 2009 HOJA DE EJERCICIOS 3 HERENCIA ENTRE CLASES Y POLIMORFISMO DE MÉTODOS Esta hoja de ejercicios
GUÍA DE TRABAJO N 1 C# Ing. Néstor Raúl Suarez Perpiñan Página 1 de 13
Página 1 de 13 Tema: FUNDAMENTOS DE PROGRAMACIÓN EN LENGUAJE C# Objetivo: Conocer y manejar correctamente los tipos de datos y las diferentes estructuras de programación que hacen parte del lenguaje de
Windows API. 17 de Agosto de 2009. UCSC, Concepción, Chile. Windows API. Ronald Valenzuela Fica. Windows API. Ejemplos. Hello World Unicode
UCSC, Concepción, Chile 17 de Agosto de 2009 Clase Anterior Etapas de la Compilación Preprocesamiento Compilación Ensamblaje Enlace Herramientas para Compilar Makefile Herramientas para Desarrollo IDE
Punteros y Memoria Dinámica II
Repaso Punteros y Memoria Dinámica II Curso INEM. Programación en C++ Santiago Muelas Pascual [email protected]! Memoria! Qué necesita el compilador para acceder a una variable?! Punteros! Operadores &
Programación Orientada a Objetos en C#.NET CAPÍTULO 8 DELEGADOS. Ing. Bruno López Takeyas, M.C.
CAPÍTULO 8 DELEGADOS 2 http://www.itnuevolaredo.edu.mx/takeyas 1 Preguntas detonadoras Qué es un delegado? Para qué sirve? En qué circunstancias se recomienda implementar delegados? Qué es un método anónimo?
A continuación se mostrará un breve resumen del lenguaje, extraído del libro El Lenguaje de Programación C#.
C# C# es un lenguaje sencillo, moderno y orientado a objetos, que pertenece a la plataforma.net y es creado por Microsoft. A continuación se mostrará un breve resumen del lenguaje, extraído del libro El
FACULTAD DE ECONOMIA Y ADMINISTRACION DEPARTAMENTO DE CIENCIAS DE LA COMPUTACION CÁTEDRA PROGRAMACION GENERAL. Trabajo Práctico Nº 4
Trabajo Práctico Nº 4 Ejercicios Teóricos 1. Indique si las siguientes afirmaciones son verdaderas o falsas a. La programación orientada a objetos hace uso de clases y envío de mensajes entre objetos..
Variables. Una variable no es más que un nombre simbólico que identifica una dirección de memoria: vs.
Variables Una variable no es más que un nombre simbólico que identifica una dirección de memoria: Suma el contenido de la posición 3001 y la 3002 y lo almacenas en la posición 3003 vs. total = cantidad1
La última versión disponible cuando se redactó este manual era la 5 Beta (versión ), y sobre ella versa este manual.
Manual de Dev-C++ 4.9.9.2 Página 1 de 11 Introducción Dev-C++ es un IDE (entorno de desarrollo integrado) que facilita herramientas para la creación y depuración de programas en C y en C++. Además, la
Hoja de ejercicios del Tema 9
Facultad de Informática Universidad Complutense Fundamentos de la programación Curso 2013 2014 Hoja de ejercicios del Tema 9 1. Sin ejecutarlo, qué mostraría el siguiente código? int x = 5, y = 12, z;
Programación orientada a objetos (I)
Programación orientada a objetos (I) Introducción a la POO La programación orientada a objetos es la penúltima evolución respecto a las metodologías de programación. En esta entrada veremos algunos de
QUÉ ES UNA CLASE JAVA? ATRIBUTOS (PROPIEDADES O CAMPOS), CONSTRUCTOR Y MÉTODOS. (CU00623B)
APRENDERAPROGRAMAR.COM QUÉ ES UNA CLASE JAVA? ATRIBUTOS (PROPIEDADES O CAMPOS), CONSTRUCTOR Y MÉTODOS. (CU00623B) Sección: Cursos Categoría: Curso Aprender programación Java desde cero Fecha revisión:
GENERACIÓN DE CÓDIGO ORIENTADO A OBJETOS
GENERACIÓN DE CÓDIGO ORIENTADO A OBJETOS A.- ASPECTOS FUNDAMENTALES DEL CÓDIGO ORIENTADO A OBJETOS MÓDULOS DE CÓDIGO: El código en Visual Basic se almacena en módulos. Hay tres tipos de módulos: de formulario,
Tema: Sobrecarga. Objetivos. Materiales y Equipo. Introducción Teórica. Programación II. Guía No. 7
Programación II. Guía No. 7 1 Facultad: Ingeniería Escuela: Computación Asignatura: Programación II Tema: Sobrecarga. Objetivos Describir como redefinir (sobrecargar) operadores para que funcionen con
Todo programa en 'C' consta de una o más funciones, una de las cuales se llama main.
LENGUAJE C CARACTERISTICAS DEL LENGUAJE 'C' El lenguaje 'C' se conoce como un lenguaje compilado. Existen dos tipos de lenguaje: interpretados y compilados. Los interpretados son aquellos que necesitan
Tipos de Datos Estructurados
- Unidad 3 Tipos de Datos Estructurados 1 Tipos de Datos Compuestos en C 2 Arreglos (1) Un arreglo (array) una colección homogénea de datos simples ó compuestos, que se referencian con un nombre comú,
INTRODUCCIÓN A VISUAL C++
INTRODUCCIÓN A VISUAL C++ PARTES DE UN PROGRAMA EN VISUAL C++ (Windows Forms) Un programa en Windows Forms, está orientado a ser creado de forma rápida y funcionar dentro de una soporte o ventana que denominamos
PROGRAMACIÓN ORIENTADA A OBJETOS (L40629) Sabino Miranda-Jiménez
PROGRAMACIÓN ORIENTADA A OBJETOS (L40629) Sabino Miranda-Jiménez Elementos de lenguaje: Identificadores Tipos de datos 2 Tipos de datos primitivos 3 Tipos de datos referenciados Clases Interfaces Arrays
Introducción a Java. Introducción a Java. Programación I
Introducción a Java Introducción a Java Programación I Como Funciona Tipos de Datos TIPO TAMAÑO RANGO byte 8 bits Valores numéricos de 128 a 127 short 16 bits Valores numéricos de 32.768 a 32.767 int 32
Programación en Visual Basic Ricardo Rodríguez García
Manual Básico de Programación en Visual Basic 1.- Estructura de un proyecto Visual Basic Los programas o aplicaciones desarrolladas en Visual Basic van a constituir un único paquete que denominaremos proyecto.
Las clases como tipos de datos definidos por el usuario
. La clase Fraccional. Representación en UML de los niveles de acceso 3. Categorías de los objetos que aparecen en los métodos 4. El puntero this. Métodos operadores La clase Fraccional Vamos a diseñar
Tipos de variables. Lenguaje C. Departamento de Electrónica. Tipos de datos, variables y constantes. Fundación San Valero
Lenguaje C Tipos de variables Departamento de Electrónica Fundación San Valero Tipos de datos, Cinco tipos de datos básicos: Carácter (char): 8 bits -128 a 127. Entero (int): 32 bits -2.147.483.648 a 2.147.483.647.
Programación I Funciones
1 Funciones Iván Cantador 2 Funciones: definición, sintaxis, ejemplos (I) Una funciónes un bloque de sentencias identificado con un nombre que se ejecutan de manera secuencial ofreciendo una funcionalidad
Tema: Introducción al IDE de Microsoft Visual C#.
Tema: Introducción al IDE de Microsoft Visual C#. Objetivos: El propósito de este tema es que el alumno se familiarice con el entorno de desarrollo de Visual C# Express mientras crea el formulario más
Ejercicio 1. Ejercicio 2
Todos los ejercicios incluyen una parte opcional de mayor dificultad, indicada con una serie de asteriscos en función del grado de dificultad. Ejercicio 1 Este ejercicio servirá para practicar la declaración
Laboratorio de Arquitectura de Redes. Punteros en lenguaje C
Laboratorio de Arquitectura de Redes Punteros en lenguaje C Punteros en lenguaje C Definición Declaración e inicialización de punteros Operadores de punteros: «*» y «&» Operaciones con punteros Operaciones
