Kernel Error

Acerca de Llyn

Miembro desde: 01/01/2009

Posts

It’s time to choose

Digamos esto, dado un valor quieres hacer algo. Ejemplo,

enum {
	John, Paul, Ringo, George
} quien_fue = Paul;

switch (quien_fue) {
	case John: cout << "Fue John." << endl; break;
	case Paul: cout << "Fue Paul." << endl; break;
	case Ringo: cout << "Fue Ringo." << endl; break;
	case George: cout << "Fue George." << endl; break;
};

Leer mas

Usar una imagen como portada de carpeta en Windows

Portada de carpeta
Un tema corto, en Windows existen varias formas de tener una imagen como la portada de una carpeta, entre ellos están el crear un icono y añadirlo a desktop.ini, usar una opción (algo limitante) en versiones viejas del explorador. Existe una tercera el cual es tener un archivo Folder.jpg y AlbumArtSmall.jpg las cuales son usadas automáticamente por el explorador (y WMP, WMC, etc.) como portada de la carpeta.

El siguiente código (en C# para variar) emplea la tercera opción, se encarga de leer una imagen dada en la línea de comando del programa, crear una vista previa (con un borde añadido) y guardarlo como los archivos respectivos.
Leer mas

Especialización de Plantillas

En este tema, trataré la especialización de plantillas de manera general.

Antes que todo, recordemos que una plantilla permite aplicar procedimientos comunes con distintos tipos de datos sin tener que reescribir el código. Podemos tener como ejemplo la clase de STL, std::vector<T>. Con la especialización de plantillas, en cambio, se permitir definir procedimientos o estructuras para casos particulares. Tal es el caso de std::vector<bool> en la librería STL que utiliza menos espacio que la clase genérica. Leer mas

Portapapeles en Windows

Unos 135 días desde mi último post, pero quien los cuenta.

Bien, en vez de explicar el cómo utilizar el portapapeles mediante Win32 (relativamente no tan largo, pero no vale la pena), presentaré la clase newcastle::clipboard, la cual nos permitirá manejar en un programa de C++ operaciones básicas del portapapeles de Windows en tiempo de ejecución sin requerir de mucho código. Para su uso se incluyen dos archivos al proyecto, clipboard.h y clipboard.cpp. El primero declara el objeto clipboard y sus operaciones en el nombre de espacio newcastle, y va a ser el archivo a incluir para el uso de la clase. Leer mas

Mapa de mensajes: Parte 1

Bien, un largo tiempo desde mi último tema. Trataré de actualizar los temas anteriores. Ahora, para redimirme un poco hablaré una implementación en C++ de lo que Microsoft denominó mapa de mensajes (tabla de métodos virtuales dinámica). La empresa lo hizo pensando principalmente en el manejo de ventanas, pero se puede aplicar (como la misma compañía hizo) a otras ideas.

Por ahora, describiré el tema pensando en las ventanas de Windows (posiblemente exagerando en este aspecto) pero el objeto es ofrecer una clase independiente del sistema operativo. Observación: el uso del lenguaje en este tema requiere de ciertos conocimientos avanzados. De todos modos se puede aprender un poco. Leer mas

Mapa de mensajes: Parte 2

Como lo indiqué al final de la primera parte, aquí tenemos a Bind():

template <class _Class, class _ParamType>
void MessageTarget::Bind(int nMessage, int (_Class::*function)(_ParamType *)) {
	union {
		int (_Class::* fptr)(_ParamType *);
		int (MessageTarget::* vptr)(void *);
	} f = { function }; // Ya tenemos al puntero para guardarlo.
	MESSAGE t = {
		/* nMessage = */	nMessage,
		/* nDist = */		0, // No viene al caso ahora
		/* pAddress = */	f.vptr;
		};
	m_MessageMap.push_back(t); // Añadimos la estructura
};

Leer mas

Suma de dos números en base ‘n’

Tenemos dos números como cadena de caracteres, ambas en la misma base, y nuestro objetivo es sumarlos. Una opción es utilizar la función strtol() para convertir las cadenas a números y entonces sumarlos, y convertir la suma de nuevo a cadena con _ltoa(). Esto funciona siempre y cuando los números no sean ni muy grandes (overflow) ni muy pequeños (underflow). No obstante, tambien se puede usar un procedimiento de pseudo-suma, la cual nos quita esta limitación.
Leer mas

DFS

DFS, acrónimo para Depth-First Search, en español Búsqueda en Profundidad, es un algoritmo usado para procesar grafos, una búsqueda tal como lo describe el nombre. La idea es que se toma como prioridad en la búsqueda la profundidad del nodo. Para demostrarlo, el siguiente grafo presenta como contenido de los nodos, el índice en el cual es procesado.

Grafo para demostrar el algoritmo de DFS
Leer mas

Manejo de bits fuera de gcc

Bien, las siguientes funciones que trabajan con bits pertenecen solo al compilador gcc:

  • __builtin_ctz
  • __builtin_clz
  • __builtin_popcount

Por lo tanto, si se requiere el uso en otros compiladores puede no encontrarse soporte, en mi caso, por ejemplo, que uso Visual C++, de tal modo que realice la implementación de tales funciones en C++, adjunto le añado una pequeña descripción para aquel que no los conozca:
Leer mas

Kernel Error
97 intentos de ataques detenidos