C/Visual C - Memoria Compartida en las DLLs

 
Vista:

Memoria Compartida en las DLLs

Publicado por enrique (13 intervenciones) el 30/10/2003 20:24:28
Tengo una DLL que instala una función filtro (con un Hook) para cada mensaje WM_CREATE. Necesito inicializar la DLL con la lectura de una configuración desde fichero. El problema es que leido para el primero, no se comparte en memoria para las siguientes instancias de la DLL.
La única manera sería realizar una lectura del fichero por cada instancia.
Pero eso sería intolerable,
¡¡¡ Imaginad un acceso a disco por todos los WM_CREATE del sistema !!!.
Debo de encontrar una manera de leer ese fichero una sola vez, y que lo leido se conserve en memoria para todas las instancias de la DLL.
¿ Alguien podría ayudarme ?
Gracias de antemano.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Memoria Compartida en las DLLs

Publicado por Liebesschmerz (40 intervenciones) el 30/10/2003 22:04:28
Create un archivo mapeado con CreateFileMapping para que reserves un espacio de memoria con atributos de lectura y escritura, con eso podras hacer que todas las instancias compartan lo que quieras.

o tambien puedes crear un segmento y ponerlo con attributos de compartimiento esto e slo mas utilizaco por programadores de vc++ para eso puedes pbuscar info acerca de #pragma data_seg("Nombre")
no olvides de poner en sus atributos que sera compartido
#pragma comment(linker, "/section:Nombre,RWS")
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Memoria Compartida en las DLLs

Publicado por Enrique (13 intervenciones) el 31/10/2003 11:13:22
Ante todo, gracias por responderme.
Sobre el tema de la \"section\" compartida tengo:
//=======================================================
// Shared DATA
//=======================================================
#pragma data_seg(\"shardat\")
HANDLE hInstance = 0; // Global instance for DLL
HWND hWndMain = NULL; // Main hwnd.
char szFicLog [128] = { NOM_FICHERO } ;// Nombre del fichero.
HHOOK vhHook[NUM_HOOKS]; // Descriptores de Hook.
#pragma data_seg()
//=======================================================

Y también pongo:
/section:shardat,RWS

Pero no se porqué sigue sin funcionar.
¿Tienes algún ejemplo que lo realice ?

Sobre la reserva de memoria, ¿como compartimos el puntero que contiene la dirección ?. Si no me funciona la compartición, donde guardo esa dirección de memoria.

Gracias otra vez.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Memoria Compartida en las DLLs

Publicado por Liebesschmerz (40 intervenciones) el 01/11/2003 02:47:56
1 que tipo de hook estas pasando a SetWindowsHookEx() ?
2 si usas lo de compartir una "seccion" no necesitas guardar un puntero a nada, solo usar las variables.
3 declaraste todo bien, funcion callback ? y pasarte el handle del hook al siguiente hook con CallNextHookEx() ?
4 tu hook tiene que ser global osea el threadid sera 0
5 no estoy seguro de esto, pero lo que vas a compartir no debes inicializarlo

no veo tu codigo, osea que no puedo ver que haces mal
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Memoria Compartida en las DLLs

Publicado por Enrique (13 intervenciones) el 04/11/2003 11:10:53
Ante todo ,gracias.
1- El Hook es el de WH_CALLWNDPROC
2- debo de utilizarlas mal.
3- El Hook funciona, capturo todos los mensajes enviados por 'SendMessage', y todos ellos pasan al final en la función de filtro por CallNextHookEx.
4- Mi Hook es global. El id del Thread es 0, y cojo el valor de la instancia que me da el DllMain.
5- yo tampoco estoy seguro.

Si te mando todo el código que tengo te morirías, ¿No sería mejor que me enviases un ejemplo de compartición de memoria por 'Section'?

Gracias por todo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Memoria Compartida en las DLLs

Publicado por Liebesschmerz (40 intervenciones) el 04/11/2003 12:59:22
1) el tipo de hook es WH_GETMESSAGE, porque quieres agarrar el WM_CREATE no ? eso lo agarra la funcion GetMessage() y no SendMessage()
2) solo tengo en MASM32, que es para un hook de tipo CBT, pero aqui te dejo un link http://www.codeguru.com/misc/IPCwDataSegs.shtml en vc++
3) WH_GETMESSAGE
4) bien
5) va cualquiera inicializada o no

chao
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Lo he solucionado

Publicado por Enrique (13 intervenciones) el 06/11/2003 22:35:20
Otra vez gracias.
Me doy respuesta, para informar de que he solucionado el problema.

En cuanto a utilizar WH_GETMESSAGE (GetMessage) en vez de WH_CALLWNDPROC (SendMessage), yo he utilizado este último.
Es decir, con SendMessage, si que capturo los mensajes WM_CREATE.
De todas formas también probaré con GetMessage, ya que no siempre se utiliza SendMessage (PostMessage, por ejemplo).

En cuanto a porque no me funcionaba lo de la SECTION de variables compartidas, encontré una frase que decía:
"el nombre de la sección no puede pasar de los 8 caracteres, y siempre debe de empezar por '.' (punto) ".
Mi SECTION incumplia las dos normas.

En cuanto a compartir zonas de memoria existen las funciones de 'mapeado de ficheros en memoria': CreateFileMapping y MapViewOfFile.
La primera te crea un objeto que es el área de memoria asociada a un fichero o a un nombre. En nuestro caso no tiene que ser a un fichero, sino a un nombre, con lo cual tenemos un área de memoria identificada por un nombre, con el tamaño que nosostros le indicamos.
Con el descriptor devuelto por esta función, la función MapViewOfFile, nos devuelve el puntero a esa zona de memoria.
Para cada instancia de la Dll, nosotros abrimos con OpenFileMapping y el nombre que le hemos dado a esa área, y otra vez con MapViewOfFile tenemos el puntero a esa zona de memoria compartida.

Información:
En el link, que me distes, y también en el art. del MSDN:
"Using Shared Memory in a Dynamic-Link Library"
tambien en "www.lawebdejm.com"

Hasta pronto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar