2010-04-12 2 views
0

Avec win32api, je veux que le programme suivant crée deux processus et crée un filemap. (en utilisant C++)CreateFileMapping MapViewOfFile

Je ne sais pas ce que je devrais écrire à Handle CreateFileMapping(.... Je l'ai essayé avec:

PROCCESS_INFORMATION hfile. 

En outre, le premier paramètre doit être INVALID_HANDLE_VALUE, mais je ne sais pas quoi écrire dans MapViewOfFile comme premier paramètre.

le code du premier programme: (je n'ai pas programmé le 2. & 3. parce que même le premier ne fonctionne pas)

//Initial process creates proccess 2 and 3 

#include <iostream> 
#include <windows.h> 
#include <string> 

using namespace std; 

void main() 
{ 

bool ret; 
bool retwait; 
bool bhandleclose; 

STARTUPINFO startupinfo; 
GetStartupInfo (&startupinfo); 

PROCESS_INFORMATION pro2info; 
PROCESS_INFORMATION pro3info; 

//create proccess 2 
wchar_t wcsCommandLine[] = L"D:\\betriebssystemePRA2pro2.exe"; 


ret = CreateProcess(NULL, wcsCommandLine, NULL, NULL, false, CREATE_NEW_CONSOLE, NULL, 
    NULL, &startupinfo, &pro2info); 


if (ret==false){ 
    cout<<"Prozess konnte nicht erzeugt werden. Fehler:"<<GetLastError(); 
    ExitProcess(0); 
} 

//*************** 


//create process3 

wchar_t wcs2CommandLine[] = L"D:\\betriebssystemePRA2pro3.exe"; 


ret = CreateProcess(NULL, wcs2CommandLine, NULL, NULL, false, CREATE_NEW_CONSOLE, NULL, 
    NULL, &startupinfo, &pro3info); 


if (ret==false){ 
    cout<<"Prozess konnte nicht erzeugt werden. Fehler:"<<GetLastError(); 
    ExitProcess(0); 
} 



//*************** 



//create mapping object 

// program2: 




PROCESS_INFORMATION hfile; 





    CreateFileMapping( //erzeugt filemapping obj returned ein handle 
    INVALID_HANDLE_VALUE, //mit dem handle-->kein seperates file nötig 
    NULL, 
    PAGE_READWRITE, //rechte (lesen&schreiben) 
    0, 
    5, 
    L"myfile"); //systemweit bekannter name 


    LPVOID mappointer = MapViewOfFile(//virtuelle speicherraum, return :zeiger, der auf den bereich zeigt 
    INVALID_HANDLE_VALUE, //handle des filemappingobj. 
    FILE_MAP_ALL_ACCESS, 
    0, 
    0, 
    100); 



    //wait 
    cout<<"beliebige Taste druecken"<<endl; 
    cin.get(); 


//close 


bool unmap; 

unmap = UnmapViewOfFile (mappointer); 

if (unmap==true) 
    cout<<"Unmap erfolgreich"<<endl; 
else 
    cout<<"Unmap nicht erfolgreich"<<endl; 


bhandleclose=CloseHandle (INVALID_HANDLE_VALUE); 
cout<<bhandleclose<<endl; 

bhandleclose=CloseHandle (pro2info.hProcess); 
bhandleclose=CloseHandle (pro3info.hProcess); 


ExitProcess(0); 


} 

Répondre

2

MapViewOfFile prend la poignée retournée par CreateFileMapping:

HANDLE hFileMapping = CreateFileMapping(...); 
LPVOID lpBaseAddress = MapViewOfFile(hFileMapping, ...); 
1

Vous devez transmettre la valeur de retour CreateFileMapping comme premier paramètre de MapViewOfFile. En outre, le nombre d'octets à mapper dans MapViewOfFile doit être suffisamment petit pour que la vue ne soit pas plus longue que le fichier lui-même.

HANDLE hMapping = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 
            0, 5, L"myfile"); 

LPVOID mappointer = MapViewOfFile(hMapping, FILE_MAP_ALL_ACCESS, 0, 0, 5); 
Questions connexes