MapViewOfFile 在XP第2個程式執行時會 return null |
答題得分者是:RaynorPao
|
brook
資深會員 發表:57 回覆:323 積分:371 註冊:2002-07-12 發送簡訊給我 |
我在測2個程式共用記憶,發現在98跑起來正常,但在XP上執行時,第2個程式
MapFilePointer=MapViewOfFile(hMapFile,FILE_MAP_ALL_ACCESS,0,0,0); 卻返回null,而 FILE_MAP_ALL_ACCESS 改成 FILE_MAP_READ 則ok. 但我需要用到 WRITE,該如何解決? [code cpp] 請在此區域輸入程式碼 #include #include #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; LPVOID MapFilePointer; HANDLE hMapFile; char *p; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { if (p) { strcpy(p,Edit1->Text.c_str()); } } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { if (p) { Edit2->Text = p; } } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { //取得′MyMappedFile′映象文件的控制碼 hMapFile=OpenFileMapping(FILE_MAP_READ,true,"MyMappedFile"); //使用API函數來建立映象文件 if (!hMapFile) hMapFile = CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0l,1000l,"MyMappedFile"); if (hMapFile) { //MapViewOfFile函數返回一個指向共用記憶體塊的在該程式記憶體空間中有效的指標 MapFilePointer=MapViewOfFile(hMapFile,FILE_MAP_ALL_ACCESS,0,0,0); // MapFilePointer=MapViewOfFile(hMapFile,FILE_MAP_READ,0,0,0); //XP } else ShowMessage("CreateFileMapping 函數返回 NULL!"); p = (char*)MapFilePointer; if (p == NULL) ShowMessage("MapViewOfFile 函數返回 NULL!"); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormDestroy(TObject *Sender) { UnmapViewOfFile(MapFilePointer); CloseHandle(hMapFile); } //------------------------------------------------------ [/code] |
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
HANDLE CreateFileMapping( HANDLE lpAttributes, // security DWORD dwMaximumSizeHigh, // high-order DWORD of size DWORD lpName // object name ); 建議你從 CreateFileMapping 中的第二個參數下手,可能會使用到的 API 包括(不一定會全部都用到): AllocateAndInitializeSid GetLengthSid LocalAlloc InitializeAcl AddAccessDeniedAce AddAccessAllowedAce InitializeSecurityDescriptor SetSecurityDescriptorDacl ...
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
brook
資深會員 發表:57 回覆:323 積分:371 註冊:2002-07-12 發送簡訊給我 |
非常感謝 RaynorPao 大大的回答.
程式第二次執行時我用到OpenFileMapping取得映象文件的控制碼,其實不用, 繼續使用CreateFileMapping即可. [code cpp] void __fastcall TForm1::FormCreate(TObject *Sender) { /* //取得′MyMappedFile′映象文件的控制碼 hMapFile=OpenFileMapping(FILE_MAP_READ,true,"MyMappedFile"); //使用API函數來建立映象文件 if (!hMapFile) hMapFile = CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0l,1000l,"MyMappedFile"); */ hMapFile = CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0l,1000l,"MyMappedFile"); if (hMapFile) { //MapViewOfFile函數返回一個指向共用記憶體塊的在該程式記憶體空間中有效的指標 MapFilePointer=MapViewOfFile(hMapFile,FILE_MAP_ALL_ACCESS,0,0,0); //MapFilePointer=MapViewOfFile(hMapFile,FILE_MAP_READ,0,0,0); //XP } else ShowMessage("CreateFileMapping 函數返回 NULL!"); p = (char*)MapFilePointer; if (p == NULL) ShowMessage("MapViewOfFile 函數返回 NULL!"); } [/code] |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |