全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2671
推到 Plurk!
推到 Facebook!

MapViewOfFile 在XP第2個程式執行時會 return null

答題得分者是:RaynorPao
brook
資深會員


發表:57
回覆:323
積分:371
註冊:2002-07-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-12-28 17:21:23 IP:122.126.xxx.xxx 訂閱
我在測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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-01-10 15:32:56 IP:220.130.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-01-10 16:03:13 IP:122.126.xxx.xxx 訂閱
非常感謝 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]
系統時間:2024-04-24 0:33:35
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!