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 - Eternal Idol

#2441
Cita de: dewolo en 10 Octubre 2011, 16:58 PMah y antes de llamar a terminateprocess tenes que haber llamado a createprocess  ::)

No necesariamente, podes matar procesos creados por otros procesos.
#2442
Exactamente, por eso en el primer mensaje te puse si habia alguna razon para no hacer esto, es lo mejor por lejos  ;D
#2443
Aca esta el metodo ideal que equivale a COM: "C++ Mature Approach: Using an Abstract Interface"

DLL con una funcion exportada para crear el objeto:
Código (cpp) [Seleccionar]
#include <windows.h>

BOOL APIENTRY DllMain (HANDLE, DWORD, LPVOID)
{
    return TRUE;
}

class Datos
{
public:
Datos();
virtual void setVALOR(int v);
virtual int getVALOR();
virtual void Release();

private:
int VALOR;
};

Datos::Datos()
{
VALOR = 0;
}

void Datos::setVALOR(int v)
{
VALOR = v;
}

int Datos::getVALOR()
{
return VALOR;
}

void Datos::Release()
{
delete this;
}

extern "C" __declspec(dllexport)  Datos *newDatosObject()
{
return new Datos;
}


Ejecutable con clase abstracta, Datos es una caja negra y llamamos a la funcion para crear el objeto (que destruimos con el metodo Releaes indirectamente):
Código (cpp) [Seleccionar]
#include <windows.h>
#include <cstdio>

class Datos
{
public:
virtual void setVALOR(int v) = 0;
virtual int getVALOR() = 0;
virtual void Release() = 0;
};

int main()
{
HMODULE hMod = LoadLibrary(TEXT("graphics.dll"));
if (hMod)
{
typedef Datos* (*newDatosObject_ptr)();
newDatosObject_ptr newDatosObject = (newDatosObject_ptr)GetProcAddress(hMod, "newDatosObject");
Datos *pDatos = newDatosObject();
if (pDatos)
{
int x = pDatos->getVALOR();
printf("%d\r\n", x);
pDatos->setVALOR(x + 34);
x = pDatos->getVALOR();
printf("%d\r\n", x);

pDatos->Release();
}
FreeLibrary(hMod);
}

return 0;
}
#2445
ASM / Re: Uso de WinDbg y Llamadas de APIs????
10 Octubre 2011, 09:43 AM
Es solo cuestion de practica, cuando te acostumbras y sabes los comandos de memoria no es dificil  ::)
#2446
No ... pero si tenes propiedades a menos que uses un metodo para inicializarlas a sus valores por defecto seguramente vas a tener problemas ...
#2447
No nos estamos entendiendo, intenta hacer lo que queres y asegurate de que en algun lado se llame al constructor dela clase para el objeto que creas (con o sin hack) ...
#2448
Cita de: dewolo en  9 Octubre 2011, 22:47 PMahi modifique "FuncionQueUsaUnParametroDeClaseDatos" le agruege el & para que pueda ser modificada en la DLL  :) , osea que el EXE la llama, le pasa el objeto, y se modifica por esta funcion que se importa de la DLL

No dije eso, ahora la pasas por referencia pero el punto era que tenes que llamar al constructor del objeto ... igual que cuando hacias malloc + puntero a funcion para llamarlo, por eso decia de pasarle al constructor &objeto_de_datos.

Cita de: dewolo en  9 Octubre 2011, 22:47 PMpero porqe sigue el problema del constructor? eso lo que no entiendo si en este caso el problema es que ambos codigos usan la misma clase, pero el EXE que importa esa clase no usa ningun miembro, solamente crea un objeto, se lo pasa como parametro a la funcion y esa funcion es la que lo modifica y internamiente ella si llama algunos metodos pero eso se hace en la DLL.

¿Donde esta el codigo del constructor? ¿En la DLL unicamente, no? Bueno ... por eso sigue el problema.

Cita de: dewolo en  9 Octubre 2011, 22:47 PMy sobre el IMPORT para la clase en el EXE entonces no es necesario en mi caso no?, o si porque yo hago carga dinamica de esa funcion "FuncionQueUsaUnParametroDeClaseDatos" no necesito .lib ...

No.
#2449
Los torpes tambien merecemos que nos ayuden.
#2450
ASM / Re: Uso de WinDbg y Llamadas de APIs????
9 Octubre 2011, 21:13 PM
Para buscar funciones podes usar el comando x asi:

x kernel32!*getw*

No tiene scroll ... usa el comando u y sino PAGE UP/DOWN tambien funciona en esa ventana.