2009-09-14 84 views
0

如何使用Win32 API從文件寫入共享內存?寫入共享內存

我有這樣的代碼:

hFile = CreateFile("input.map", 
    GENERIC_READ | GENERIC_WRITE, 
    FILE_SHARE_READ, 
    NULL, 
    OPEN_ALWAYS, 
    FILE_ATTRIBUTE_NORMAL, 
    NULL); 

    hMapFile = CreateFileMapping(hFile, 
    NULL, 
    PAGE_READWRITE, 
    0, 
    0, 
    TEXT("SharedObject")); 

    lpMapAddress = (LPTSTR) MapViewOfFile(hMapFile, 
    FILE_MAP_ALL_ACCESS, 
    0, 
    0, 
    0); 

    ReadFile(
    hFile, 
    lpMapAddress, 
    75, 
    &bytesRead, 
    NULL); 

    sprintf((char*)lpMapAddress, "<output 1>"); 

    printf((char*) lpMapAddress); 

然而,printf的調用僅返回 「<輸出1>」,而不是文件內容。編輯: 發現問題。我在調用sprintf時正在寫入輸入文件。但我仍然不知道爲什麼...

回答

2

這是整個代碼示例?在我看來,對於sprintf的調用,在lpMapAddress處放置了一個以空字符結尾的字符串,它可以有效地覆蓋從文件中讀取的任何內容 - 至少爲了您的printf語句的目的。

如果要替換的你以字符串"<output 1>"讀到的第一部分,你可以讀取文件之後:

char *tmp = "<output 1>"; 
strncpy((char*)lpMapAddress, tmp, strlen(tmp)); 

那份字符串的文本,但不是它的空終止符。

+0

這有幫助!最後使用strcat()。 – pypmannetjies 2009-09-14 19:50:31

2

sprintf<output 1>之後存儲NUL,並且printf在第一個NUL處停止。

(此外,這是一個壞主意,通過一些隨機文件的格式printf。如果它所包含%字符?但是,這是另一個問題。)

我寫輸入文件時我 調用sprintf。但我仍然不知道爲什麼 ...

,因爲這是MapViewOfFile。它將文件的內容與一塊內存相關聯。該文件的當前內容出現在內存塊中,並且您對該內存所做的任何更改都將寫入該文件。

0

我真的不明白你在這裏得到什麼。不管你以前寫了什麼代碼;最後一行是總是將返回您放入前一個「sprintf」行的緩衝區中的字符串。因爲那是「<output 1>」,是的,這將返回。

+0

那麼,即使註釋掉sprintf調用也沒有效果... – pypmannetjies 2009-09-14 19:29:13

1

我不認爲你需要在映射後調用ReadFile。只需訪問lpMapAddress中的內容即可。

但是,使用MapViewOfFile的常量不會使用內存文件映射。

+0

好點。猜猜一些代碼是不必要的。 – pypmannetjies 2009-09-14 19:49:51