|
Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.
Temas - krnl64
1
« en: Jueves 9 de Septiembre de 2010, 21:02 »
Hola, estoy escribiendo una pequeña clase para abrir una consola en programas con interfaz gráfica y usarla para emitir información de depuración. Por comodidad, intento redirigir los flujos de la consola para poder usar cin, cout y cerr en vez de apis para leer y escribir en ella El código que les presento yo diria que es correcto, pero no se comporta bien en ejecución. Si hago un cin, ya no escribe nada en pantalla al usar cout. Sólo si uso cerr y escribe todo lo que haya en el buffer. En vista de estos fallos, uso GetLastError después de hacer cin, y me dice INVALID_HANDLE_VALUE. No entiendo por qué se cierra el handle. Edit: Pruebas hasta ahora sin resultado: 1º Obtener el handles de entrada, salida y error con GetStdHandle en el constructor. Intentar restaurarlos con SetConsoleActiveScreenBuffer. cout sigue sin escribir en consola. 2º Cerrar el handle de salida con CloseHandle, volver a abrirlos con GetStdHandle y usar cout. Aqui GetLastError dice que no hay error, pero no se escribe nada en consola 3º Abrir los flujos de consola CONIN$,CONOUT$,CONERR$ con CreateFile. Restaurarlos con SetConsoleActiveScreenBuffer y usar cout. GetLastError dice INVALID_HANDLE y no se escribe nada en consola Pueden decirme qué es lo que hago mal ? PD: uso W Xp SP3 y VC++ 2008 Gracias console.h // console.h #ifndef __CONSOLE_H__ #define __CONSOLE_H__ #include <iostream> #include <fstream> using std::cout; using std::cin; using std::cerr; using std::streambuf; using std::ofstream; using std::ifstream; class console { private: ofstream n_cout; ofstream n_cerr; // new streams ifstream n_cin; streambuf* old_cout; streambuf* old_cerr; // old streams streambuf* old_cin; public: console(); ~console(); void hide(); void show(); // not implemented yet }; #endif
console.cpp #include "console2.h" #include <windows.h> console::console() { // create a console window AllocConsole(); // redirect cout to console window this->old_cout = cout.rdbuf(); this->n_cout.open("CONOUT$"); cout.rdbuf( this->n_cout.rdbuf() ); // redirect cerr this->old_cerr = cerr.rdbuf(); this->n_cerr.open("CONOUT$"); cerr.rdbuf( this->n_cerr.rdbuf() ); // redirect cin this->old_cin = cin.rdbuf(); this->n_cin.open("CONIN$"); cin.rdbuf( this->n_cin.rdbuf() ); } console::~console() { // restore streams cin.rdbuf( this->n_cin.rdbuf() ); cerr.rdbuf( this->n_cerr.rdbuf() ); cout.rdbuf( this->n_cout.rdbuf() ); // free console resources FreeConsole(); }
// main.cpp #include <windows.h> int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) { // all WNDCLASSEX, RegisterClassEx,CreateWindow, etc stuff console c; int number = 0; cout << "n cout works"; cerr << "n cerr works"; cin >> number; // cin works DWORD error = GetLastError(); // INVALID_HANDLE_VALUE ¿ por qué ? cout << "n The number is: " << number; // Esto ya no funciona cerr << number; // ahora escribe todo lo que haya en el buffer }
2
« en: Jueves 22 de Julio de 2010, 20:44 »
Hola, he escrito una clase lista cuya interfaz declaro a continuación class linkedlist { public: linkedlist(void); // default constructor linkedlist (const linkedlist& tocopy); // copy constructor ~linkedlist(); // destructor bool insert ( const int value ); // insert element bool remove ( void ); // remove first element bool is_empty ( void ) const; // returns if the list is empty int size ( void ) const; // return list size linkedlist& operator = (const linkedlist& list); // overload = operator int& operator [] ( const int index ) const; // overload subscript operator private: struct node { int value; // node struct node* next; }; int elements; // amount of elements node* firstnode; // first node };
Lo que quiero conseguir es que cuando escriba esto linkedlist* lista1 = NULL; linkedlist* lista2 = NULL; // creo lista1 con new lista2 = lista1;
no se copie tal cual el objeto, sino que se cree memoria para el y se copien los valores. He probado a sobrecargar el operador = de esta manera linkedlist& operator = (const linkedlist* &list);
pero no consigo que cuando se ejecuta la linea 7 entre en la funcion. Alguien sabe como hacer esto ? Gracias
3
« en: Miércoles 21 de Julio de 2010, 17:55 »
Hola, tengo un par de dudas acerca del comportamiento de los destructores. Mirando http://www.parashift.com/c++-faq-lite/dtors.html punto 11.11 dice que cuando cuando se destruye un objeto se llama automáticamente a los destructores de los miembros de los que esta compuesto. Se refiere a los miembros que no son punteros ? Que ocurre si en el destructor pongo las variables miembro a su valor por defecto entonces ? ( por ejemplo pongo un entero a 0 o a NULL) Editado : ya vi el fallo del code de antes A ver si me pueden esclarecer el tema un poco Gracias
4
« en: Miércoles 10 de Febrero de 2010, 22:17 »
Hola amigos. Estoy intentando reservar memoria para una variable externa a la función que la reserva. Dentro de la función la reserva y la usa,pero al volver el codigo a donde hizo la llamada falla. Concretamente falla en la linea 17 de main.c Por más que miro no sé donde está el fallo. Pueden hecharme una mano ? Gracias. aleatorio.h void alsr(int **vector, int inicio, int fin, int cuantos);
aleatorio.c #include<stdio.h> #include<stdlib.h> #include "aleatorio.h" void alsr(int **vector, int inicio, int fin, int cuantos) { int *temporal=NULL; int i; int j; int pos; int lon; lon=fin-inicio; /*Pedir memoria para temporal.*/ temporal =(int*)malloc(lon *sizeof(int)); if(temporal==NULL) return; for(i=0;i<lon;i++) { *(temporal+i)=inicio+i; } /*Pedir memoria array externo*/ *vector =(int*)malloc(cuantos *sizeof(int)); if(vector==NULL) return; /*Llenamos el vector de aleatorios*/ for(i=0;i<cuantos;i++) { /* Si tengo mas de un elemento */ if(cuantos > 1) { /*Copio el elemento de esa posicion al original*/ *(vector+i)=*(temporal+pos); /*Realmente atrasamos el elemento del array*/ for(j=pos;j<lon-1;j++) *(temporal+j)=*(temporal+j+1); /*Vamos eliminando el ultimo elemento*/ lon--; temporal =(int*)realloc(temporal ,lon *sizeof(int)); } else { *(vector+i)=*(temporal); } } temporal=0; return; }
main.c #include <stdio.h> #include <stdlib.h> #include "aleatorio.h" #define cantidad 2 int main(int argc,char *argv[]) { int *tmp=0; int i; alsr(&tmp,1,5,cantidad); for(i=0;i<cantidad;i++) { } }
5
« en: Lunes 25 de Enero de 2010, 14:29 »
Hola a todos, veran he desarrollado un calendario en html / js (no esta acabado) y en firefox funciona. Pero acabo de abrirlo en IE8 y me dice que tengo un error. En concreto dice "Error desconocido en tiempo de ejecucion en Linea 28 caracter 3 en el archivo de js". Por mas que reviso mi fuente no veo el error. Les pongo el codigo a ver si pueden decirme donde esta el error. Gracias Web <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http] Js (donde peta) [code=js] function dmonth(iMonth, iYear) { return 32 - new Date(iYear, iMonth, 32).getDate(); } function ponceldas() { var celdas=''; var i; var j; for(i=0;i<6;i++) { celdas+='<tr>'; for(j=0;j<7;j++) celdas+='<td class="day"></td>'; celdas+='</tr>'; } document.getElementById('calendario').tBodies[0].innerHTML+=celdas; pond(0,0); } function pond(y,m) { var celdas; var i; var maxdias; var dia=1; var day; var hoy; if (m==0 && y==0) { hoy=new Date(); day=hoy.getDate(); hoy.setDate(1); } else hoy=new Date(parseInt(y),parseInt(m),1); // dias del mes actual maxdias=dmonth(hoy.getMonth(),hoy.getFullYear()); celdas=document.getElementById('calendario').tBodies[0].getElementsByTagName('td'); // mes y año document.getElementById('mes').selectedIndex=hoy.getMonth(); document.getElementById('anio').innerHTML=' '+hoy.getFullYear()+' '; //vacio todas las celdas for(i=0;i<celdas.length;i++) celdas[i].innerHTML=''; // calculo el desplazamiento del dia de la semana en base al que js me da for(i=(hoy.getDay()+6)%7;i < celdas.length;i++) { if (dia<=maxdias) { celdas[i].innerHTML=dia; dia+=1; } } } function pm() { pond(document.getElementById('anio').textContent,document.getElementById('mes').value); }
6
« en: Miércoles 16 de Diciembre de 2009, 18:06 »
Hola a todos. Verán tengo un ArrayList en el que quiero meter varios tipos de objetos. He heredado del control TextBox y le he añadido otra propiedad Tag llamada Tag2 para almacenar datos que necesite. La declaracion del objeto que almacena el contenido de la propiedad es: y la declaracion de la propiedad: <TypeConverter(GetType(StringConverter))> _ <Browsable(True), DescriptionAttribute("Propiedad Tag 2"), CategoryAttribute("EProperties")> _ Public Property Tag2() As Object Get Return (Me._tag2) End Get Set(ByVal value As Object) Me._tag2 = value End Set End Property
Entonces, en la propiedad Tag2 almaceno el nombre del tipo al que quiero convertir el contenido Text de mi TextBox. Queda asi: micontrol.Text="12/12/1999" micontrol.Tag2="System.DateTime"
Entonces al añadir el item al ArrayList, esta sentencia me falla: miarraylist.Add(DirectCast(micontrol.Text,Type.GetType(micontrol.Tag2.ToString()))
No es correcta la conversion ? Cómo puedo solucionar esto ? Gracias
7
« en: Miércoles 16 de Septiembre de 2009, 02:47 »
Este es el codigo del juego del ahorcado pero en su forma complicada. En el codigo fuente se usa la modularizacion punteros y la API de windows.
Un ejemplo muy didactico.
Autor: ++K
8
« en: Martes 15 de Septiembre de 2009, 18:25 »
Hola amigos, tengo un código que me está dando problemas. Tengo un array de estructuras y quiero modificarlo dentro de una función por medio de punteros. No entiendo por qué lo hago mal. Haber si pueden hecharme un cable, gracias main.c typedef struct { char nombre[20]; int puntos; }ITEM; void func1(ITEM *persona, int longitud) { char *nombres[]={"Fernando","Pablo"}; int i; for(i=0;i<longitud;i++) { strcpy(&(*(persona +i )). nombre,*(nombres +i )); // aqui falla &(*(persona+i)).puntos=30; } int main( int argc, char *argv[]) { ITEM listaitem[]= { {"Manuel",20},{"Fernando",10} }; int i; func1(listaitem,2); for(i=0;i<2;i++) { printf("n %s %d",listaitem [i ]. nombre,listaitem [i ]. puntos); } }
9
« en: Lunes 1 de Junio de 2009, 19:06 »
Hola a todos. Estoy intentando hacer una función que recibe un array de strings y dentro copia ese array a uno temporal y lo redimensiono a n-1 para luego seguir trabajando con él. Pero no me lo hace bien. Les pongo el code y les comento: void redimlista(char **lista_palabras,const int longitud_lista) { char **lista_temporal; int i; int num; int longitud_lista_temporal; char palabra[8]; /* Pido memoria para almacenar los punteros a cadena */ lista_temporal =(char**)calloc(longitud_lista ,sizeof(char*)); /* Voy a copiar toda la lista de palabras al array temporal */ for(i=0;i<longitud_lista;i++) { /* Reservo memoria para almacenar la cadena 8 porque 8 es la longitud máxima de las palabras */ *(lista_temporal +i )=(char*)calloc(8,sizeof(char)); /*Copio la cadena */ strcpy(*(lista_temporal +i ),*(lista_palabras +i )); } /* Guardo la longitud del array de palabras */ longitud_lista_temporal=longitud_lista; /* Elijo una palabra aleatoriamente de la lista de palabras */ num =rand()%longitud_lista_temporal ; /* Copio la palabra elegida */ strcpy(palabra ,*(lista_temporal +num )); /* Adelanto todos los elementos un lugar */ for(i=num;i<longitud_lista_temporal-1;i++) *(lista_temporal+i)=*(lista_temporal+i+1); /* Linea problematica */ free(*(lista_temporal +i )); longitud_lista_temporal--; lista_temporal =(char**)realloc(lista_temporal ,longitud_lista_temporal *sizeof(char*)); /* .... mas codigo... */ }
El código de la línea 37 es el que me da problemas. Por ejemplo,si a la función le paso un array de 5 palabras al hacer el free, me libera la memoria de los elementos 4 y 5 en vez de solo el 5º. Es decir: Antes del free *(lista_temporal+3)="pepe" *(lista_temporal+4)="paco"
Después del free *(lista_temporal+3)= liberado *(lista_temporal+4)= liberado
Y lo que quiero conseguir es: *(lista_temporal+3)= "pepe" *(lista_temporal+4)= liberado
para poder redimensionar después con realloc. Cómo puedo arreglar esto ? Gracias
10
« en: Lunes 1 de Junio de 2009, 01:29 »
Hola a todos, Hice una función para trabajar con un array de strings pero no sé por qué no me funciona. Les pongo el code: void test( char **aray,int size) { char **tmp; int i=0; tmp =(char**)calloc(size ,sizeof(char*)); for(i=0;i<size;i++) { //strcpy(*(tmp+i),*(aray+i)); } for(i=0;i<size;i++) { }
Si uso la declaración de la linea 14, no sé por qué no copia bien la cadena y si uso la declaración de la línea 13 me peta al hacer free. Pueden decirme que hago mal ? Gracias.
11
« en: Miércoles 27 de Mayo de 2009, 22:24 »
Hola a todos. Hace un tiempo les pregunte acerca de como hacer un scanf personalizado. Me dijeron como podia leer los datos correctamente con fgets y sscanf. Hasta aqui ok. Bueno, hice la función y me dio por iniciar la variable referenciada dentro de la función pero no me lo hace bien. Les enseño el codigo y les explico: void myscanf(const char *formato,...) { char bufferinterno[80]; int vars=0; /* codigo para contar los argumentos de entrada basicamente cuento los % para saber las variables que tengo que leer (almacenado en vars) */ /* Inicio el buffer interno */ memset(bufferinterno ,0,sizeof(bufferinterno )); /* intento iniciar la variable referenciada */ memset(*(&format +vars ),0,sizeof(*(&format +vars ))); }
Lo que me ocurre es que cuando hago esto char buffer[50]; myscanf("%s",buffer);
El memset de la linea 19 no inicia correctamente el buffer porque *(&format+vars) apunta al primer caracter del buffer y no hay forma de saber cuál es su tamaño para iniciarlo correctamente. Hay alguna forma de saber cuanto ocupa la variable referenciada o el unico remedio seria pasarle a la función su tamaño para iniciarla correctamente ? O inciarla antes de pasarsela a la función. Gracias
12
« en: Miércoles 27 de Mayo de 2009, 03:48 »
Hola a todos, les comento mi duda:
Tengo una placa Asus P5KPL-VM/S y un micro Core 2 Duo E6750. Hasta ayer tenía instalados 2 modulos de 1 Gb DDR2 667 Mhz Kingston. Fenómeno hasta aqui. Ahora he comprado 2 modulos de 1 GB DDR2 a 800 Mhz Kingston y se los he puesto.
Las especificaciones de mi placa dicen:
Front Side Bus: 1333(overclock)1066,800 Mhz Memory: 4Gb 667/800Mhz Dual Channel
Ahora corro el Everest y me dice:
Propiedades del bus principal: Tipo de bus Intel AGTL+ Ancho de bus 64 bit Reloj real 333 MHz (QDR) Reloj efectivo 1333 MHz Ancho de banda 10664 MB/s
Propiedades del bus de memoria: Tipo de bus Dual DDR2 SDRAM Ancho de bus 128 bit Relación DRAM:FSB 12:10 Reloj real 400 MHz (DDR) Reloj efectivo 800 MHz Ancho de banda 12797 MB/s
No entiendo por qué me hace cuello de botella si la el manual de la placa dice que soporta la DDR2 800Mhz. Pueden decirme que hacer para que vayan a la par la memoria y el fsb ? Gracias
13
« en: Lunes 25 de Mayo de 2009, 22:16 »
Hola, quiero leer un carácter de entre una serie de caracteres permitidos con scanf. Por qué me falla este code si le estoy diciendo que lea solo 1 caracter ? unsigned char caracter=0; scanf("%1[1234]",&caracter )
Gracias.
14
« en: Jueves 14 de Mayo de 2009, 21:30 »
Hola a todos. Estoy intentando hacer un wrapper para scanf. Mi intencion es limpiar el buffer de consola antes y despues ejecutar la funcion scanf original. El code es este: void myscanf(const char *format,...) { va_list args; char c; }
El caso es que a scanf no le llegan los argumentos .... y no se por qué. Puede alguien decirme que he hecho mal ? PD: tengo todos los includes. Gracias
15
« en: Martes 25 de Noviembre de 2008, 09:23 »
Hola a todos, tengo un problema que no sé solucionar con un control que me estoy creando. Verán, estoy intentando hacerme un control para hacer mapas para rpg's a base de tiles. Comencé a hacerlo como una clase que hereda de un panel y dentro otro panel que es donde dibujo una malla. No usé el diseñador, y lo hice de esta manera porque asi el scroll me lo hace solo. Bueno, pues hago el code, me pinta y todo muy bonito pero cuando la ventana pierde el foco, lo que he pintao dentro del 2º panel se pierde. He intentando hookear el WndProc del panel interior, pero no se hacerlo. Pueden decirme que puedo hacer para repintar el contenido del control ? Les dejo aqui el code: class Grid2:Panel { Panel p2; private int hcells; private int vcells; private int theigth; private int twidth; private const int WM_PAINT = 0xF; public Grid2(int sizetile, int height, int width) { this.AutoScroll=true; this.BorderStyle=BorderStyle.FixedSingle; this.Width=600; this.Height=600; // N1 de celdas this.hcells=height; this.vcells=width; this.twidth=sizetile; this.theigth=sizetile; p2=new Panel(); p2.Height=this.vcells*this.theigth; p2.Width=this.hcells*this.twidth; p2.Paint += new PaintEventHandler(p2_Paint); p2.MouseMove += new MouseEventHandler(p2_MouseMove); this.Controls.Add(p2); } void p2_MouseMove(object sender, MouseEventArgs e) { if (e.Button==MouseButtons.Left) { int x; int y; Panel p; Pen pn=new Pen(Color.Green,2); Graphics g; x=(e.X/32); // Averiguo en que casilla esta el raton y=(e.Y/32); g=((Panel)sender).CreateGraphics(); // DrawRectangle (x,y(origen),ancho, alto) g.DrawRectangle(pn,new Rectangle(x*this.twidth,y*this.theigth,this.twidth,this.theigth)); g.Dispose(); } } #region Propiedades /// <summary> /// Nº de celdas de ancho /// </summary> public int Hcells { get { return(this.hcells); } set { this.hcells=value; } } /// <summary> /// Nº de celdas de alto /// </summary> public int Vcells { get { return(this.vcells); } set { this.vcells=value; } } /// <summary> /// Alto del tile /// </summary> public int Theigth { get { return(this.theigth); } set { this.theigth=value; } } /// <summary> /// Ancho del tile /// </summary> public int Twidth { get { return(this.twidth); } set { this.twidth=value; } } #endregion void p2_Paint(object sender, PaintEventArgs e) { int x; int y; Pen mypen=new Pen(Color.Gray); // lineas verticales for (x=0;x<this.hcells*this.twidth; x+=this.twidth) e.Graphics.DrawLine(mypen,x,0,x, this.hcells*this.twidth); // lineas horizontales for (y = 0; y < this.vcells * this.theigth; y += this.theigth) e.Graphics.DrawLine(mypen, 0, y, this.hcells * this.theigth, y); e.Graphics.DrawRectangle(mypen, 1, 1, this.theigth * this.hcells - 2, this.twidth * this.vcells - 2); } } }
Gracias
16
« en: Sábado 21 de Junio de 2008, 10:21 »
Hola a todos. Hice un programa que cuando captura una excepcion finaliza la app y te crea un thread que te saca un topic de un chm (explicación del error). El codigo que ejecuta el thread es este: Private Shared Sub Ayuda() Dim hp As New HelpProvider hp.SetHelpNavigator(Me,HelpNavigator.Topic) hp.SetHelpKeyWord(Me,60) Help.ShowHelp(me,"Help.chm") end Sub
Pero el thread no espera para terminar que el usuario cierre la ventana de ayuda que se abre. No se me ocurre cómo hacer esto. Pueden ayudarme ? Gracias.
17
« en: Domingo 25 de Mayo de 2008, 16:03 »
Hola a todos. Verán hice un programa un poco denso que necesita cargar bastantes datos antes de mostrar el form principal, asi que me hice una clase SplashScreen.
Mi clase crea un form, barra de progreso, un par de labels y hace fades al aparecer y desparecer.
Mi problema es que cuando la inicio, tengo que poder esperar a que el fade de aparicion se complete para poder mandarle datos y que actualize la progressbar.
Es decir, que el form termine de aparecer en pantalla antes de hacer nada más.
Porque ahora mismo, tengo en el form_load del form principal una llamada a esa clase y despues todas las operaciones de carga del programa, pero cuando inicia la splashscreen inmediatamente sigue ejecutando por la instruccion siguiente sin esperar a que el timer que hace el fade de aparicion se pare.
Pueden decirme como puedo hacer eso ?
Gracias
18
« en: Miércoles 7 de Mayo de 2008, 06:02 »
Alguna vez quisieron ordenar el contenido de un Listview en modo Details al pinchar encima del nombre de la columna y que se ordenara segun su contenido ? Pues esta clase que les dejo les ayudará. Puede ordenar texto, enteros, dni's y fechas Ascendente y Decendente. Si usan esta clase "tal y como está" Respeten la documentacion XML por favor. El uso de esta clase se resume en esta sentencia: Listview1.ListViewItemSorter = New Comparador(e.Column,Comparador.metodo.FechaAsc)
donde: e.Column es un entero que representa la columna a ordenar metodo.FechaAsc es el tipo de dato y la forma de orden Por si las moscas, les comento que ese code se pondria en el evento Column_Click. ''' <summary> ''' Ordena los Items de un ListView segun la columna que se le pase y el tipo de dato ''' </summary> ''' <remarks>Coded by Krnl64 '08</remarks> Public Class Comparador Implements System.Collections.IComparer ''' <summary> ''' Tipo de Dato y Orden ''' </summary> Public Enum metodo ''' <summary> ''' Texto en orden Ascendente ''' </summary> TextoAsc ''' <summary> ''' Texto en orden Descendente ''' </summary> TextoDesc ''' <summary> ''' DNI's sin tener en cuenta la letra Ascencente ''' </summary> DNIAsc ''' <summary> ''' DNI's sin tener en cuenta la letra Descendente ''' </summary> DNIDesc ''' <summary> ''' Fechas en orden Ascendente ''' </summary> FechaAsc ''' <summary> ''' Fechas en orden Descendente ''' </summary> FechaDesc ''' <summary> ''' Numeros en orden Ascendente ''' </summary> ''' <remarks></remarks> NumeroAsc ''' <summary> ''' Numeros en orden Descendente ''' </summary> NumeroDesc End Enum Private ordenar As metodo Private col As Integer ''' <summary> ''' Constructor ''' </summary> ''' <param name="columna">Entero que especifica la columna del Listview a ordenar</param> ''' <param name="datasort">Tipo de dato a ordenar y la forma</param> Public Sub New(ByVal columna As Integer, ByVal datasort As metodo) ordenar = datasort col = columna End Sub ''' <summary> ''' Comparador de varios tipos de datos ''' </summary> ''' <param name="x">Cualquier tipo de dato Soportado (Object)</param> ''' <param name="y">Cualquier tipo de dato Soportado (Object)</param> ''' <returns>Resultado de la comparacion</returns> Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare Select Case ordenar Case metodo.TextoAsc Return (String.Compare(CType(x, ListViewItem).SubItems(col).Text, CType(y, ListViewItem).SubItems(col).Text)) Case metodo.TextoDesc Return (String.Compare(CType(y, ListViewItem).SubItems(col).Text, CType(x, ListViewItem).SubItems(col).Text)) Case metodo.DNIAsc ' Puede parecer complicao pero lo que hace es coger el nº del dni sin letra y lo compara Return (CType(x, ListViewItem).SubItems(col).Text.Substring(0, CType(CType(x, ListViewItem).SubItems(col).Text.Length - 1, Integer)) - CType(y, ListViewItem).SubItems(col).Text.Substring(0, CType(CType(y, ListViewItem).SubItems(col).Text.Length - 1, Integer))) Case metodo.DNIDesc Return (CType(y, ListViewItem).SubItems(col).Text.Substring(0, CType(CType(y, ListViewItem).SubItems(col).Text.Length - 1, Integer)) - CType(x, ListViewItem).SubItems(col).Text.Substring(0, CType(CType(x, ListViewItem).SubItems(col).Text.Length - 1, Integer))) Case metodo.NumeroAsc Return (CInt(CType(x, ListViewItem).SubItems(col).Text) - CInt(CType(y, ListViewItem).SubItems(col).Text)) Case metodo.NumeroDesc Return (CInt(CType(y, ListViewItem).SubItems(col).Text) - CInt(CType(x, ListViewItem).SubItems(col).Text)) Case metodo.FechaAsc Return (DateTime.Compare(DateTime.Parse(CDate(CType(x, ListViewItem).SubItems(col).Text)), DateTime.Parse(CDate(CType(y, ListViewItem).SubItems(col).Text)))) Case metodo.FechaDesc Return (DateTime.Compare(DateTime.Parse(CDate(CType(y, ListViewItem).SubItems(col).Text)), DateTime.Parse(CDate(CType(x, ListViewItem).SubItems(col).Text)))) End Select End Function ''' <summary> ''' Destructor ''' </summary> Protected Overrides Sub Finalize() ordenar = 0 col = 0 MyBase.Finalize() End Sub End Class
19
« en: Viernes 28 de Marzo de 2008, 15:03 »
Hola a todos. Veran, estoy tratando de hacer un cheat para un juego (solo por gusto, apenas juego xD). Abro el proceso y busco las variables pertinentes. Pero todos los procesos empiezan en 0x10000 y acaban en 0x7FFE0FF0 (en mi sistema, o por lo menos eso me dice la estructura SYSTEM_INFO) entonces este bucle que es que lee: // si es un puntero a SYSTEM_INFO currentAddress=(DWORD)si.lpMinimumApplicationAddress; // Obtengo la direccion donde comienza el proceso // Estare leyendo hasta llegar al final del espacio de direcciones del proceso while (currentAddress < (DWORD)si.lpMaximumApplicationAddress) { VirtualQueryEx(...) ReadProcessMemory(...) }
Pero tarda siglos en recorrer todas las direcciones. Cómo podria hacer para leer solo las direcciones desde donde empieza a donde acaba ? Es decir, abri el regmon con el WinHex y empieza en 0x10000 y acaba en 5B187FF0 (en mi equipo) Como puedo averiguar esa direccion ? Gracias
20
« en: Viernes 14 de Diciembre de 2007, 13:22 »
Hola a todos.
Verán estoy tratando de arrancar el ordenador desde una iso. Use el FASM para generar el bin de arranque y otro bin que seria un interprete de comandos.
Copiandolos a un floppy y a archivos IMG (para el VMWARE) funciona bien.
Pero qué puedo hacer para conseguir arrancar desde una iso ?
Probe a ponerle un autorun, pero no funciona.
Gracias
21
« en: Domingo 25 de Noviembre de 2007, 22:20 »
Hola a todos. Estoy empezando en esto del masm32 y codeando un simple programa que te escribe una palabra en la consola y espera a que pulses una tecla para terminar,me han surgido algunas dudas que no consigo resolver. Les pongo mi code y les cuento: .386 .model flat, stdcall option casemap:none include kernel32.inc include windows.inc includelib kernel32.lib .data ;variables necesarias msg db 'hola',0 buff db ? hout dd ? hin dd ?; handles de e/s tit db 'Consola Demo',0 .code start: call con call pinta push hin call CloseHandle ; Cierro los handles abiertos push hout call CloseHandle call FreeConsole ; Cierro la consola ; Salgo de forma controlada push NULL call ExitProcess con proc ;call AllocConsole ; solicito poder crear una consola ; Esto sobra porque el programa es de consola push STD_OUTPUT_HANDLE call GetStdHandle; obtendre el handle de la consola mov hout,eax ; copio a hout el handle obtenido push STD_INPUT_HANDLE call GetStdHandle mov hin,eax ; handle de entrada lea eax,tit push eax call SetConsoleTitle ;titulo de la consola ret con endp pinta proc push NULL; nulo lea eax,buff; buffer de escritura push eax; meto el buffer en la pila push 4;longitud del mensaje lea eax,msg push eax; meto la cadena en la pila push hout;meto en la pila el handle call WriteConsole ;llamo a la funcion push NULL push NULL push NULL; los parametros son nulos porque no voy a push NULL; almacenar el dato leido, excepto el handle que push hin ; es necesario call ReadConsole ret pinta endp end start
Empiezo a ejecutar y obtengo los handles de E/S de la consola. Me escribe la palabra hola (esto menos mal que lo hace bien) y espera a que pulse enter, pero en este procedimiento el handle de salida desaparece y en LastError pone ERROR_INVALID_ACCESS. Cuando regresa a la rutina principal al cerrar los handles, me cierra el handle de entrada pero el de salida no, porque no existe. FreeConsole y ExitProcess funcionan bien. Pueden decirme el por qué de estos fallos ? porque estoy buscando info y no consigo averiguarlos. Creo que el handle de salida de la consola desaparece "solo" porque cumple su funcion y no se va a usar más, pero no estoy muy seguro. Espero que me puedan aclarar esas dudillas. Gracias
22
« en: Miércoles 21 de Noviembre de 2007, 18:19 »
Hola a todos. Verán estoy intentando hacer un code que me elimine los elementos repetidos de un vector. Pero resulta que el code que he escrito falla a veces. Le he dado 1000 vueltas y no se porqué falla (en teoria es correcto lo que he escrito) Podrían ayudarme a resolver el problema ? Mi code es este: Dim v() As Integer Dim i As Integer Dim j As Integer Dim z As Integer Dim limit As Integer Randomize() Console.WriteLine(Chr(10) & "Introduzca el numero de elementos del vector") limit = Console.ReadLine ReDim v(limit - 1) For i = 0 To v.Length - 1 v(i) = Int(Rnd() * 10) + 1 'Console.ReadLine Next Console.Write(Chr(10) & "El contenido del vector es: ") For i = 0 To v.Length - 1 Console.Write(" " & v(i)) Next For i = 0 To UBound(v) For j = i + 1 To UBound(v) - 1 '' me adelanto una pos If v(j) = v(i) Then '' Si son iguales... For z = j To UBound(v) - 1 '' me pongo en la pos del elemento a borrar If (z <> UBound(v)) Then v(z) = v(z + 1) '' adelanto los elementos 1 lugar Next ReDim Preserve v(UBound(v) - 1) End If Next Next Console.Write(Chr(10) & "El contenido del vector es: ") For i = 0 To UBound(v) Console.Write(" " & v(i)) Next Console.ReadKey()
Gracias
23
« en: Lunes 22 de Enero de 2007, 20:37 »
Hola a todos.
Verán, cuando se migra de un lenguaje como VB a C uno hecha de menos ciertas funciones como Lbound y Ubound que devuelven el elemento inferior y superior del vector.
Me pregunto que cómo puedo hacer una función que haga esto.
De esa forma, trabajar con vectores dinámicos seria más cómodo porque podria disponer de su longitud en cualquier momento y hacer un realloc.
Por ahora lo que hago, es "llevar la cuenta" de los elementos que introduzco en él en una variable global y tener cuidado de que no se pase.
O en algunos casos, almaceno Sizeof vector /Sizeof(tipo de dato) en una variable y lo redimensiono a ese dato.
Puede decirme alguien cómo puedo implementar esta función u otra forma de hacerlo ?
Gracias
24
« en: Sábado 2 de Diciembre de 2006, 17:21 »
Hola a todos.
Verán, me baje de programmers Heaven una utilidad para C que transforma 1 fichero PE en uno H.
Mi duda es que no se como usarlo. El programa te genera 1 H con 1 matriz de codigo en ASM.
Yo pensaba que para usarlo, habia que copiar la matriz de codigo a un fichero. Pero no funciona.
Les mando 1 RAR con el programa, un fichero de C y el mismo convertido en H a ver si alguien sabe usarlo.
Alguien puede ayudarme ?
Gracias
25
« en: Sábado 11 de Noviembre de 2006, 12:37 »
Hola a todos.
Verán, tengo una duda acerca de los ficheros de recursos en C.
Resulta que estoy migrando de VB a C y en VB se podía incluir cualquier fichero dentro del fichero de recursos. Es decir, en VB yo podia meter 1 OCX que sólo era extraido del fichero de recursos cuando lo necesitaba .
Mi problema actual es el siguiente:
He desarrollado un pequeño compilador (nada serio, ejercicios de clase) y me gustaria incluir si es posible los archivos NASM y TLINK dentro de un fichero de recursos asociado al compilador. De esta forma, solo tendria que portar el compilador estando dentro de él el ensamblador y el linkador.
Tambien existen la posibilidades de guardar los binarios como texto y después volcarlos a un archivo, pero me parece un poco cutre la solución o ejecutar un compresor PE que te integre todos los ficheros PE en uno solo.
Es posible incluir los ficheros PE en uno de recursos asociado al compilador sin usar ninguna de las soluciones anteriores ?
Gracias
|
|
|