Domanda

Sto creando una DLL C ++ Win32 con alcuni dati globali. C'è uno std :: map definito globalmente e ci sono funzioni esportate nella DLL che scrivere dati nella mappa (dopo aver acquisito un blocco di scrittura, naturalmente).

Il mio problema è, quando chiamo la funzione di scrittura dall'interno del DllMain dll, funziona senza problemi. Ma quando ho caricare la DLL da un altro programma e chiamare la funzione che scrive i dati nella mappa globale, mi dà questo errore:

WindowsError: exception: access violation reading 0x00000008

C'è qualcosa che si può fare su questo? La stessa funzione quando chiamata da DllMain ha accesso ai dati globali nella DLL, ma quando chiamato da un processo differente, esso non ha accesso ai dati globale. Si prega di consulenza.

Sto usando il gcc TDM-MinGW 4.4.0 del compilatore.

Modifica Ok, ho capito qual è il problema, e grazie per l'aiuto ragazzi, ma il problema non era con un problema di costruttore o incapacità di avere le mappe nello spazio globale, ma un problema nel boost :: python che sto utilizzando. Avevo provato, ma dato che mi stava chiamando il dll all'interno di pitone o forse qualcosa, il modulo urllib2 non è stato sempre caricato nel dll. Ora devo vedere come risolvere il problema.

È stato utile?

Soluzione

Sembra che il costruttore di std::map non è stata eseguita ancora quando il codice è stato chiamato. Durata dei non-POD globali in una DLL Win32 è piuttosto difficile, e io non sono certo di come MinGW gestisce specificamente esso. Ma può essere che il modo in cui si sta compilando la DLL, hai impostato la propria funzione (DllMain?) Come un punto di ingresso, e quindi escludeva la routine di inizializzazione CRT che chiama i costruttori.

Altri suggerimenti

Un errore di leggere a tale indirizzo di memoria a basso significa in genere che si sta tentando di accedere a un puntatore NULL da qualche parte. Si può mostrare il vostro codice vero e proprio?

È necessario utilizzare la memoria condivisa, in quanto i diversi processi hanno spazi di indirizzi separati. Penso che non sarà possibile ottenere std :: map esecuzione. Ti consiglio di utilizzare MapViewOfFile, CreateFileMapping, OpenFileMapping, ... e vecchi dati pianura. Chiedi Google / MSDN.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top