0

Comment puis-je attribuer de la mémoire partagée à un tampon statique comme suit, mais en utilisant CreateFileMapping et MapViewOfFile.Allouer de la mémoire partagée statique à l'aide de MapViewOfFile

#pragma data_seg(".ABC") 
__declspec (dllexport) char buffer[10000] = {0}; 
#pragma data_seg() 
#pragma comment(linker, "-section:.ABC,rws") 

L'objectif est de créer un tampon statique partagée qui est partagée entre applications C++ et Fortran, comme cela se fait lors de l'utilisation data_seg. Lors de la création d'un tampon alloué dynamique, FORTRAN devient difficile car vous devez décocher le pointeur, ce qui est également faisable, mais ce n'est pas ce que je veux.

+0

Quelle est la vraie question? –

+0

Sommes-nous censés savoir ce que sont 'CreateFileMapping' et' MapViewOfFile'? –

+1

@JonathanMee: Fonctions de WinAPI: [CreateFileMapping] (https://msdn.microsoft.com/fr-fr/library/windows/desktop/aa366537 (v = vs.85) .aspx) et [MapViewOfFile] (https : //msdn.microsoft.com/en-us/library/windows/desktop/aa366761 (v = vs.85) .aspx). OP: Quel est votre objectif, à partager avec quoi? Pourriez-vous s'il vous plaît fournir plus d'informations? –

Répondre

1

Les appels API Win32 équivalents ressemblerait à ceci:

SECURITY_DESCRIPTOR sd; 
InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION); 
SetSecurityDescriptorDacl(&sd, TRUE, NULL, FALSE); 

SECURITY_ATTRIBUTES sa; 
sa.nLength = sizeof(sa); 
sa.lpSecurityDescriptor = &sd; 
sa.bInheritHandle = FALSE; 

HANDLE hMapping = CreateFileMapping(INVALID_HANDLE_VALUE, &sa, PAGE_READWRITE, 0, 10000, TEXT("ABC")); 
if (!hMapping) ... // error handling 

char *buffer = (char*) MapViewOfFile(hMapping, FILE_MAP_WRITE, 0, 0, 10000); 
if (!buffer) ... // error handling 

// use buffer as needed... 

UnmapViewOfFile(buffer); 
CloseHandle(hMapping); 

Les deux applications devraient appeler CreateFileMapping() avec la même valeur lpName pour avoir accès au même objet de mappage dans le noyau du système. Quelle que soit l'application appelle CreateFileMapping() d'abord va créer l'objet, et la deuxième application obtiendra un handle à l'objet existant. Ensuite, MapViewOfFile() mappe l'accès mémoire dans le processus appelant à cet objet. De cette façon, les deux applications utilisent la mémoire partagée les uns avec les autres. Quand une application écrit des données dans l'objet, l'autre application va le voir.

+0

Je sais comment créer un mappage de fichier partagé mais le problème est que je ne veux pas de pointeur dynamique (char * buffer). Probablement ce que je veux n'est pas possible. – user3716892

+0

@user: Cela n'a pas beaucoup de sens. Il y a peu de différence entre le pointeur 'buffer' dans cette réponse et le tableau' buffer' dans la question. Si vous devez absolument accéder à l'objet de mappage de fichier en tant que tableau, vous pouvez facilement convertir le pointeur en référence à un type de tableau. Ou simplement indexer le pointeur. 'buffer [0] = 'A';' est légal pour le pointeur et le tableau. – IInspectable

+0

@IInspectable: ce que vous dites est vrai pour C et C++, mais rappelez-vous, l'OP demande à propos de Fortran à la place. –