【问题标题】:CreateFileMapping MapViewOfFileCreateFileMapping MapViewOfFile
【发布时间】:2011-02-07 01:35:49
【问题描述】:

使用 win32api,我希望以下程序创建两个进程并创建一个文件映射。 (使用 C++)

我不知道我应该在Handle CreateFileMapping(... 写什么。 我试过了:

PROCCESS_INFORMATION hfile.

此外,第一个参数应该是INVALID_HANDLE_VALUE,但是我不知道在MapViewOfFile 中写入什么作为第一个参数。

第一个程序的代码:(我没有编写 2.&3。因为即使第一个也不起作用)

//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);


}

【问题讨论】:

    标签: c++ windows winapi


    【解决方案1】:

    需要将CreateFileMapping的返回值作为MapViewOfFile的第一个参数传递。此外,MapViewOfFile 中映射的字节数应该足够小,以至于视图不会比文件本身长。

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

    【讨论】:

      【解决方案2】:

      MapViewOfFile 采用 CreateFileMapping 返回的句柄:

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

      【讨论】:

        猜你喜欢
        • 2015-06-15
        • 2015-08-08
        • 2010-12-25
        • 2021-08-29
        • 2012-01-26
        • 1970-01-01
        • 2013-05-04
        • 2012-06-19
        • 1970-01-01
        相关资源
        最近更新 更多