iT邦幫忙

0

ipc的share memory怎樣用c語言在windows裡實現?

ipc
  • 分享至 

  • xImage

我還是學生,最近學到的作業系統,老師要我們做出程式來

雖然是作業,我也不是說想要請妳們幫我做啦
只是希望你能夠告訴我我這段程式的問題在哪

課本上的範例沒辦法執行,會有錯誤
所以我又上網找了其他例子,東拼西湊弄出這個程式碼

所以一但出問題,我也不知道怎樣去解決

這一點還請見諒,畢竟課本上只給理論
沒有給充足的例子,所以我也是似懂非懂

//行程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);
}    
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

8
lordrd
iT邦新手 2 級 ‧ 2010-11-05 21:54:38
最佳解答

Win32API 的用法 建議你可以查 MSDN ... 不要辜負微軟的用心 ~

幾個地方要修改 ~ 你型別弄錯好幾個地方....
1.
CreateFileMapping (...) 的最後一個參數 必須為 LPCTSTR ! 你餵給他 char []... 當然過不去 !
你把 char szFileName[12] = "ShareMemory"; 改成 :
TCHAR szFileName [] = _T("ShareMemory");

你的 pBuf 宣告成 LPCTSTR ?
那 你在最後的 MapViewOfFile 返回時 要做型別轉換 !!!!!!!
pBuf = (LPCTSTR) MapViewOfFile (...);
要不然 就把 pBuf 改成 LPVOID 不是比較好嗎 ?
LPVOID pBuf;

6
sula3065408
iT邦研究生 1 級 ‧ 2010-11-08 09:41:41

如果只是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

fillano iT邦超人 1 級 ‧ 2010-12-10 19:09:12 檢舉

剛剛diff了一下...
他只改了兩個地方:

  1. shareMemory => c:shareMemory
  2. Sleep(100) => Sleep(1000)

基本上等於沒改...

我要發表回答

立即登入回答