# include < windows.h > # include < cadena > # include < iostream > # include < assert.h > utilizando std :: string, std :: cout; std :: endl; #pragma warning (disable: 4311) shareMemory clase {private: shm_name_u LPWSTR; bool is_create_file; void * sh_base; MANIPULAR semáforo; MANIPULAR file_mapping; int addr_len; pública : /* mapa CREATE_FILE se utiliza para ilustrar el uso de archivo de disco o la asignación del archivo de página, si el mapeo con un archivo de disco, memoria compartida no aparece después de la memoria de liberación problema de acceso violación, pero creará un archivo en el disco, por el nombre del archivo shm_name parámetros dados. Si la asignación de archivo de página no esté establecido en un archivo de disco * /shareMemory (const string &shm_name, bool CREATE_FILE = false): is_create_file (CREATE_FILE) {const char * _c_shm_name = shm_name.c_str (); int _size = ( int) shm_name.length () + 1; shm_name_u = (LPWSTR) malloc (_size * 2); MultiByteToWideChar (CP_ACP, 0, _c_shm_name, _size, shm_name_u, _size); semáforo = CreateSemaphore (NULL, 1,1, NULL); sh_base = NULL; file_mapping = INVALID_HANDLE_VALUE;} void * shm_open (void * addr, int longitud const, DWORD a proteger) {addr_len = longitud; MANIPULAR _file_handle = INVALID_HANDLE_VALUE; si (is_create_file) {_file_handle = CreateFile (shm_name_u, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); #ifdef _DEBUG si (_file_handle == INVALID_HANDLE_VALUE) cout < < " !! No se puede crear el archivo que utilizamos archivo de página en lugar "; #endif //fin _DEBUG} /* abrir el archivo de asignación del nombre especificado, si no existe, cree un * /file_mapping = OpenFileMapping (PAGE_READWRITE, falso, shm_name_u), si (file_mapping! = null) Goto file_mapping_exist; file_mapping = CreateFileMapping (_file_handle, NULL, PAGE_READWRITE, 0, longitud, shm_name_u); aserción #ifdef _DEBUG (file_mapping); #endif si (file_mapping == NULL) NULL retorno; file_mapping_exist: sh_base = MapViewOfFileEx (file_mapping, proteger, 0,0, longitud, addr); CloseHandle (_file_handle); regreso sh_base;} /* datos de escritura a la memoria compartida, devuelve el número de bytes de datos escritos * /int shm_write (void * dest, void * src, int size) {if return -1 (check_adress (dest)!); int _write_count = (int) sh_base + addr_len - (int) dest; si (_write_count > tamaño) _write_count = tamaño; /* uso semaphor mapa e protección Regional (diferentes hilos de la misma llamada proceso cuando está protegido) * /WaitForSingleObject (semáforo, infinito); memcpy (dest, src, _write_count); ReleaseSemaphore (semáforo, 1, NULL); FlushViewOfFile (sh_base, _write_count ); _write_count retorno;} /* leer datos de la memoria compartida, devolver el número de bytes de datos leídos ** /int shm_read (! void * src, void * dest, int size) {if (check_adress (src)) volver -1; int _read_count = (int) sh_base + addr_len - (int) src; si (_read_count > tamaño) _read_count = tamaño; memcpy (dest, src, _read_count); _read_count retorno;} ~ shareMemory () {UnmapViewOfFile (sh_base ); libre (shm_name_u); CloseHandle (semáforo); CloseHandle (file_mapping);} privada: /* para la detección de direcciones * /bool check_adress (void * addr) {if (((int) dir < (int) sh_base) | | ((Int) dir > (int) sh_base + addr_len)) {SetLastError (ERROR_ACCESS_DENIED); printf #ifdef _DEBUG (" denegado el acceso, la dirección de destino fuera de la vista del mapa "!); #endif //_ retorno de depuración false;} return true;}};prueba: el proceso de escritura principal función:
int main () {sm shareMemory (" impulso ", false); void * bs = sm.shm_open ( NULL, 1000 * 4, FILE_MAP_WRITE), si (BS == NULL) return -1; int a [10]; for (int i = 0; i < 10; ++ i) a [i] = i; sm. shm_write (s a, a, 10 * 4); Sleep (100000);} proceso de lectura principal función:
int () {sm principal shareMemory (" " impulso; , false); void * bs = sm.shm_open (NULL, 1000, FILE_MAP_READ), si (BS == NULL) {cout < < " nulo "; regreso -1;} int b [10]; sm.shm_read (s a, b, 10 * 4); for (int i = 0; i < 10; ++ i) cout < < b [i] < < " ";}
Un problema que encontré recientemente, el servicio Samba en la máquina virtual Linux norma
Dado que la mayoría del software de Windows utiliza bibliotecas de enlace dinámico, algunos
Muchas personas han probado Windows To Go y descubrieron que no importa cómo esté formateado el disc
A veces, incluso si inicia sesión en Windows o usa la cuenta de administrador para controlar
Me pide que responda: resuelva los problemas comunes que surgen de la actualización de XP a Win7
Implementar la función de copiar y pegar en la línea de comandos de CMD y PowerShell
¿Cómo iniciar sesión en la versión de computadora de WeChat sin escanear el código QR?
Cree una conexión vpn 2003 para crear una tarjeta de red única vpn
Trucos principales: habilidades de la solución de red automática de computadora
Dos consultas comando de la araña de Baidu IP
Fácil acceso al modo seguro en sistema dual
Espere a que el usuario ingrese el lote
La partición del disco de la computadora debe prestar atención al problema
Descripción Interpretación archivo de configuración del servidor Nginx completo
Barra de tareas Beauty Clear Win 7 Área de notificación Icono no válido
Flashback de la tienda de aplicaciones Win10 cómo hacerlo
Formas de evitar que el sistema Windows 8 limpie automáticamente la información en miniatura
Tutorial para la eliminación del polvo del ventilador Win8 Power Management 8.0
Cómo configurar la conexión del escritorio remoto
Cómo configurar el fondo del escritorio en la pantalla "Inicio" bajo el sistema WIN8
WinXP usa su propia herramienta de escritorio de control remoto para resolver problemas
Tres PC común de línea de comandos del sistema
Win10 actualización 10525 versión de vista previa de las precauciones