Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - xiruko

#261
hola a todos,

llevo toda la tarde con un problema que no consigo resolver y ojala alguien pueda arrojarme un poco de luz. se que podria resumir este codigo en pocas lineas usando directamente LoadLibrary pero la idea es jugar un poco para intentar entender todo lo que pasa.

la idea es que ejecuto un exe y este busca la direccion de LoadLibraryA en la dll Kernel32, para luego crear un hilo pasandole como funcion principal el puntero a LoadLibraryA y como parametro una dll creada por mi. en esta dll hay una callback function donde solo tira un messagebox, y luego otra funcion que es la que intento ejecutar despues, y es aqui donde esta el problema. el messagebox me lo tira bien, pero luego cuando intento obtener la direccion de MyFunction me tira el error de "Could not retrieve the address function".

en fin, este es el codigo de mi dll:

#include <stdio.h>
#include <windows.h>

BOOL APIENTRY DllMain (HINSTANCE hInstDLL, DWORD reason, LPVOID reserved) {

BOOL dllSuccess = FALSE;

if (reason == DLL_PROCESS_ATTACH) {
dllSuccess = MessageBox (NULL, "Funciona! :)", NULL, MB_OK);
}

return dllSuccess;
}

__declspec(dllexport) void __stdcall MyFunction (void) {

printf ("Hello world!\n");
}


y el siguiente codigo es el del ejecutable:

#include <stdio.h>
#include <windows.h>

int main (int argc, char **argv) {

HMODULE hKernel32 = GetModuleHandle ("Kernel32");
FARPROC lpLoadLib = GetProcAddress (hKernel32, "LoadLibraryA");

HANDLE hThread = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE) lpLoadLib, (void*) argv[1], 0, NULL);
WaitForSingleObject (hThread, INFINITE);

DWORD hLibModule=0;
GetExitCodeThread (hThread, &hLibModule);
if (!hLibModule) {
fprintf (stderr, "ERROR: Could not retrieve the module handle.\n");
return 1;
}

FARPROC myFunc = GetProcAddress ((void*) hLibModule, "MyFunction");
if (!myFunc) {
fprintf (stderr, "ERROR: Could not retrieve the function address.\n");
return 1;
}

       myFunc();
CloseHandle (hThread);
return 0;
}


y eso es todo... alguien puede ayudarme?

muchas gracias!

edito: perdonad cometi un error, mi problema no es con esa funcion sino con la de GetProcAddress del final. llevo demasiado rato metido en esto y pasa lo que pasa... xD
#262
pff ojala pudiera quemar a todos esos hijos de su p**a madre. ya no es por el perro en si (que tambien ya que adoro a los perros), sino directamente porque para disfrutar con el sufrimiento ajeno hay que estar completamente mal de la cabeza. el mundo estaria mejor sin gente como esta.
#263
Programación C/C++ / Re: Detectar nuevos procesos?
22 Noviembre 2012, 16:51 PM
hace 2 dias que empece a programar en windows y a leer sobre apis asi que no se si ya lo habras mirado, pero podrias empezar por aqui: PsSetCreateProcessNotifyRoutine que parece ser que es lo que buscas.

esta info la he sacado de aqui: http://social.msdn.microsoft.com/Forums/zh/vcgeneral/thread/8130ac14-4bb1-4b25-8d67-530973b1a4f4 donde ademas tambien se comentan otras maneras que quizas te puedan servir.

un saludo!
#264
Foro Libre / Re: Equacion de mates que no me sale
10 Noviembre 2012, 17:52 PM
CitarLa solución a la ecuación es 5 pero en esta ultima ecuación cuando elevo el cuadrado del lado derecho con la fórmula a^2+b^2+2ab no me da lo mismo

(a+b)^2=a^2+b^2+2ab

(a-b)^2=a^2+b^2-2ab

fijate bien en los signos.

un saludo!
#265
return ((BACKSLASH | SLASH | COLON | ASTERISK | QUESTION | QUOTES | LESS | GREATER | PIPE) & sym);

hola, no entiendo muy bien lo que haces pues estas haciendo un OR con todas las constantes. esto se traduce en que las estas sumando a nivel de bit. como ejemplo mas sencillo para que veas lo que pasa, mira esto:

a = 4 = ...0100
b = 6 = ...0110
a | b = 4 | 6 = ...0110 = 6


como veras, no tiene mucho sentido para hacer lo que tu quieres hacer ya que acabas haciendo un AND con algo extraño que no representa nada. ademas, si fuera el caso de que eso fuera correcto, tu funcion seguiria sin devolver 1 o 0, ya que por ejemplo, si el simbolo fuera el QUESTION:

QUESTION=0x10
sym=0x10
QUESTION & sym = 0x10 = 16


asi pues tu funcion devolveria 16. no te olvides que las operaciones a nivel de bit son en paralelo, es decir, el bit 0 de un numero con el bit 0 del otro, el bit 1 con el bit 1, etc.

en lugar de eso, si lo que quieres es que la funcion devuelva 1 cuando coincida con alguna de las constantes, y quieres hacerlo aplicando alguna operacion a nivel de bits, una solucion podria ser esta:

#define BACKSLASH 0x0001
#define SLASH     0x0002
#define COLON     0x0004
#define ASTERISK  0x0008
#define QUESTION  0x0010
#define QUOTES    0x0020
#define LESS      0x0040
#define GREATER   0x0080
#define PIPE      0x0100

#define NUMSYM 9

int is_symbol(int sym) {

int i, symbols[]={BACKSLASH, SLASH, COLON, ASTERISK, QUESTION, QUOTES, LESS, GREATER, PIPE};

for (i=0; i<NUMSYM; i++)
if (symbols[i]^sym == 0) return 1;

return 0;
}


donde uso la operacion XOR que dara 0 si los dos numeros son iguales. como veras es lo mismo que usar en la condicion del if un symbols[ i]==sym, pero lo puse por pedir que fuera con operaciones de bits.

si lo que quieres es que la funcion sea de 1 solo return, esto te podria servir:

int is_symbol(int sym) {

return !(BACKSLASH^sym && SLASH^sym && COLON^sym && ASTERISK^sym && QUESTION^sym && QUOTES^sym && LESS^sym && GREATER^sym && PIPE^sym);
}


aunque sinceramente no se que tan eficiente es respecto a la primera version que es mas facil de entender.

un saludo!
#266
gracias leosansan por la correccion, probe el codigo un par de veces y funcionaba bien asi que supuse que no habria ningun problema.

lo que pasa es que no entiendo porque pasa esto. si pruebo con 0.40 la solucion es correcta, pero con 1.40 no. ademas, teniendo en cuenta que la conversion a entero de un real se hace mediante truncamiento, no entiendo por que pasa esto. alguien sabe la respuesta?

gracias!
#267
te dejo otra manera de hacerlo por si te sirve de ayuda:

#include <stdio.h>

#define M1 0.25
#define M2 0.10
#define M3 0.05
#define M4 0.01

int main() {

int m1, m2, m3, m4;
float cantidad;

printf("Introduce la cantidad: ");
scanf("%f", &cantidad);

m1=(int)(cantidad/M1);
cantidad-=m1*M1;

m2=(int)(cantidad/M2);
cantidad-=m2*M2;

m3=(int)(cantidad/M3);
cantidad-=m3*M3;

m4=(int)(cantidad/M4);
cantidad-=m4*M4;

printf("Monedas de 0.25:\t%d\nMonedas de 0.10:\t%d\nMonedas de 0.05:\t%d\n"
  "Monedas de 0.01:\t%d\n", m1, m2, m3, m4);

return 0;
}


y la salida:

xiruko:~$ gcc monedas.c -o monedas
xiruko:~$ ./monedas
Introduce la cantidad: 2.43
Monedas de 0.25: 9
Monedas de 0.10: 1
Monedas de 0.05: 1
Monedas de 0.01: 3
xiruko:~$


un saludo!

modifico: no vi que ya habias resuelto tu duda. igualmente lo dejo por si te sirve.
#268
pide los numeros y almacenalos en el array, luego ordenalo de mayor a menor y quedate con los 2 primeros.

un saludo!
#269
Foro Libre / Re: Lo aprendido queda para siempre?
4 Noviembre 2012, 21:50 PM
CitarParece fantasioso, de la misma forma en que parecia fantasioso miles de años atras el poder comunicarnos a largas distancias en pocos segundos.

perdona edu, pero eso seguia siendo totalmente fantasioso hace 30 años. tan solo hace falta alejarse un poco del dia a dia para intentar ver el mundo con una minima perspectiva, y te das cuenta de que en 20 o 30 años mas probablemente casi nada sea igual de lo que es hoy en dia, y cosas como conocer como funciona el cerebro y por lo tanto, reproducirlo en un ordenador, seran posibles.

no se si lo habras visto, pero te dejo un documental del programa redes que se emite en españa (ni idea de si llega a otros sitios...) que habla sobre el futuro y la manera en la que nos uniremos con las maquinas. es uno de mis documentales preferidos, y lo habre visto 4 o 5 veces. espero que te guste tanto como a mi jaja :D

http://www.redesparalaciencia.com/80/redes/redes-10-el-futuro-la-fusion-del-alma-y-la-tecnologia

un saludo!
#270
#include <stdio.h>

int main(int argc, char** argv) {

if (argc != 2) {
printf("MODO DE USO: %s <palabra>\n", argv[0]);
return 0;
}

for (; *argv[1]; argv[1]++) printf("%c\n", *argv[1]);

return 0;
}


Cita de: asdavid en  4 Noviembre 2012, 13:45 PM
por que declaras argc y argv dentro d elos parentesis del main??
es la manera para poder pasarle argumentos al programa. antes de explicartelo mejor leete la teoria y luego pregunta en el caso de que tengas una duda concreta, sino realmente no entenderas porque se hace asi. si no te importa leer en ingles, puedes leerte este enlace que es bastante corto. si prefieres en español, buscalo en google que deben haber miles de webs que lo expliquen.

contando con que te has leido ese enlace o algun otro que explique lo mismo, argc es un entero que indica el numero de argumentos totales, siendo el minimo 1 que es el propio programa. en este caso, se llama al programa asi:
./programa coche255
por lo que habran 2 argumentos: "./programa" y "coche255". de ahi el if del principio del programa, que verifica si solo hay 2 argumentos y en el caso de que no sea asi, indica la manera de usar el programa y se cierra.

Cita de: asdavid en  4 Noviembre 2012, 13:45 PM
y el char** para que sirve??
argv es un puntero a un array de punteros a caracter. este representa los parametros pasados al programa. por ejemplo, en el caso de este programa:
./programa coche255
argv[0] sera "./programa" y argv[1] sera "coche255". si esto de los punteros no lo entiendes te recomendaria que buscaras de nuevo en google ya que hay tambien miles de webs que hablan sobre ello, y ahi te lo explicaran mucho mejor que yo aqui. si despues de leerlo tienes alguna duda entonces preguntalo aqui y te ayudaremos sin ningun problema.

luego lo que uso en el for es aritmetica de punteros. argv[1] es un puntero a una cadena, asi que la condicion del for es que haya algo en esa posicion de la cadena (que no sea NULL), luego el incremento es sumarle 1 al puntero de la cadena, y dentro tan solo se imprime el caracter en esa posicion de la cadena.

espero que te sirva de ayuda, un saludo!