我還是學生,最近學到的作業系統,老師要我們做出程式來
雖然是作業,我也不是說想要請妳們幫我做啦
只是希望你能夠告訴我我這段程式的問題在哪
課本上的範例沒辦法執行,會有錯誤
所以我又上網找了其他例子,東拼西湊弄出這個程式碼
所以一但出問題,我也不知道怎樣去解決
這一點還請見諒,畢竟課本上只給理論
沒有給充足的例子,所以我也是似懂非懂
//行程A
#include "stdafx.h"
#include "windows.h"
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
LPCTSTR pBuf;
HANDLE hFile;
//1.建立ShareMemory
char szFileName[12] = "ShareMemory";
char writeBuffer[512] = {0};
//建立一個大小為1024bytes的分享記憶體
hFile = CreateFileMapping((HANDLE)0xFFFFFFFF, NULL, PAGE_READWRITE, 0, 1024, szFileName);
//放入自己的位址空間
pBuf = MapViewOfFile(hFile,
PAGE_READWRITE,
0, 0,1024);
}
//行程B
#include "stdafx.h"
#include "windows.h"
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
LPCTSTR pBuf;
HANDLE hFile;
char szFileName[12] = "ShareMemory";
char writeBuffer[512] = {0};
//開啟分享記憶體
hFile = OpenFileMapping(
FILE_MAP_ALL_ACCESS,
szFileName
);
//放入自己的位址空間
pBuf = MapViewOfFile(hFile,
PAGE_READWRITE,
0, 0,1024);
}
Win32API 的用法 建議你可以查 MSDN ... 不要辜負微軟的用心 ~
幾個地方要修改 ~ 你型別弄錯好幾個地方....
1.
CreateFileMapping (...) 的最後一個參數 必須為 LPCTSTR ! 你餵給他 char []... 當然過不去 !
你把 char szFileName[12] = "ShareMemory"; 改成 :
TCHAR szFileName [] = _T("ShareMemory");
你的 pBuf 宣告成 LPCTSTR ?
那 你在最後的 MapViewOfFile 返回時 要做型別轉換 !!!!!!!
pBuf = (LPCTSTR) MapViewOfFile (...);
要不然 就把 pBuf 改成 LPVOID 不是比較好嗎 ?
LPVOID pBuf;
如果只是C的作業,引用iostream幹嘛?
如果只是要練習WinAPI,引用stdafx.h幹嘛?
學生要練習用Dev-C++就夠用了,也不會引用一堆莫名其妙的header檔,導致混亂!
你是在上C還是C++,上C語言引用iostream,用namespace?
要是在上C++,沒寫個物件來看看,會不會太浪費了一點?
1.函式執行成功、失敗不用檢查嗎?
2.Compiler沒告訴你OpenFileMapping輸入參數的數量是錯的嗎?
3.從來沒印出shareMemory的資料,如何證明你的程式功能是對的?
3-1.就算正確了也看不出來,比較像是你完全沒搞懂shareMemory的用途
<pre class="c" name="code">
#include "stdio.h"
#include "stdlib.h"
#include "windows.h"
#define SHAREMEM_NAME "shareMemory"
#define BULID_MESSAGE "Hello! I am burn at " __DATE__ " " __TIME__
/*
build n executions to say hello on share memory
*/
int main(int argc, char* argv[])
{
LPCTSTR pBuf;
HANDLE hFile;
int i;
char szFileName[] = SHAREMEM_NAME;
char writeBuffer[128] = {0};
//Open it if share memory had been created
hFile = OpenFileMapping(
FILE_MAP_ALL_ACCESS,
FALSE,
szFileName
);
if(NULL == hFile){
//it is new
hFile = CreateFileMapping(
(HANDLE)0xFFFFFFFF,
NULL,
PAGE_READWRITE,
0,
sizeof(writeBuffer),
szFileName
);
if(NULL == hFile){
printf("Could not create file mapping object (%d)\n",GetLastError());
return -1;
}
}else{
//created
printf("Share memory ready!\n");
}
//get share memory mapping location (address)
pBuf = (LPCTSTR)MapViewOfFile(
hFile,
FILE_MAP_ALL_ACCESS,
0,
0,
sizeof(writeBuffer)
);
if(NULL == pBuf){
printf("Could not map view of file (%d)",GetLastError());
CloseHandle(hFile);
return -2;
}
//create new line to say hello
strcat((char *)pBuf,BULID_MESSAGE "\n");
while(1){
//show string on share memory
printf("%s\n",pBuf);
Sleep(100);
}
CloseHandle(hFile);
}
參考:
1.GetLastError
http://msdn.microsoft.com/en-us/library/ms679360%28v=VS.85%29.aspx
2.System error code
http://msdn.microsoft.com/en-us/library/ms681381%28v=VS.85%29.aspx
3.OpenFileMapping
http://msdn.microsoft.com/en-us/library/aa366791%28VS.85%29.aspx
4.CreateFileMapping
http://msdn.microsoft.com/en-us/library/aa366537%28VS.85%29.aspx