C 共享記憶體操作類

2021-06-10 06:38:30 字數 3743 閱讀 4868

以下是乙個c#操作記憶體的乙個類,只要將下面的類新增到相應的專案中,該專案就可以對記憶體進行直接操作!

using system.runtime.interopservices;    //新增如下命名空間 需要是用 dllimport

public class sharememlib

{[dllimport("user32.dll", charset = charset.auto)]

public static extern intptr sendmessage(intptr hwnd, int msg, int wparam, intptr lparam);

[dllimport("kernel32.dll", charset = charset.auto)]

[dllimport("kernel32.dll", charset = charset.auto)]

[dllimport("kernel32.dll", charset = charset.auto)]

[dllimport("kernel32.dll", charset = charset.auto)]

public static extern bool unmapviewoffile(intptr pvbaseaddress);

[dllimport("kernel32.dll", charset = charset.auto)]

public static extern bool closehandle(intptr handle);

[dllimport("kernel32", entrypoint = "getlasterror")]

public static extern int getlasterror();

const int error_already_exists = 183;

const int file_map_copy = 0x0001;

const int file_map_write = 0x0002;

const int file_map_read = 0x0004;

const int file_map_all_access = 0x0002 | 0x0004;

const int page_readonly = 0x02;

const int page_readwrite = 0x04;

const int page_writecopy = 0x08;

const int page_execute = 0x10;

const int page_execute_read = 0x20;

const int page_execute_readwrite = 0x40;

const int sec_commit = 0x8000000;

const int sec_image = 0x1000000;

const int sec_nocache = 0x10000000;

const int sec_reserve = 0x4000000;

const int invalid_handle_value = -1;

intptr m_hsharedmemoryfile = intptr.zero;

intptr m_pwdata = intptr.zero;

bool m_balreadyexist = false;

bool m_binit = false;

long m_memsize = 0;

public sharememlib()

~sharememlib()

close();

//初始化記憶體

public int init(string strname, long lngsize)

if (lngsize <= 0 || lngsize > 0x00800000) lngsize = 0x00800000;

m_memsize = lngsize;

if (strname.length > 0)

//建立記憶體共享體(invalid_handle_value)

if (m_hsharedmemoryfile == intptr.zero)

m_balreadyexist = false;

m_binit = false;

return 2; //建立共享體失敗

else

if (getlasterror() == error_already_exists)  //已經建立

m_balreadyexist = true;

else           

m_balreadyexist = false;

//建立記憶體對映

m_pwdata = mapviewoffile(m_hsharedmemoryfile, file_map_write, 0, 0, (uint)lngsize);

if (m_pwdata == intptr.zero)

m_binit = false;

closehandle(m_hsharedmemoryfile);

return 3; //建立記憶體對映失敗

else

m_binit = true;

if (m_balreadyexist == false)

else

return 1;    

return 0;     

//關閉共享記憶體

public void close()

if (m_binit)

unmapviewoffile(m_pwdata);

closehandle(m_hsharedmemoryfile);

///讀資料

public int read(ref byte bytdata, int lngaddr, int lngsize)

if (lngaddr + lngsize > m_memsize) return 2; //超出資料區

if (m_binit)

marshal.copy(m_pwdata, bytdata, lngaddr, lngsize);

else

return 1;

return 0;    

//將資料寫入共享記憶體中

public int write(byte bytdata, int lngaddr, int lngsize)

if (lngaddr + lngsize > m_memsize) return 2; //超出資料區

if (m_binit)

marshal.copy(bytdata, lngaddr, m_pwdata, lngsize);

else

return 1;

return 0;    

呼叫方法:

宣告   sharememery.sharememlib memdb = new sharememlib();  為公共的變數

//用下面這句話呼叫上面類中的初始化共享記憶體的方法

if (memdb.init("yfmemtest", 10240) != 0) 

將需要寫在記憶體中的資料:轉化成為byte

memdb.write(bytdata, 0, bb.length);   //將資料寫入到共享記憶體中

byte bytdata = new byte[16];

int intret = memdb.read(ref bytdata, 0, 16);

以上方法是讀出記憶體中的16個位元組的內容

以上方法在vs2008中經過測試。

共享記憶體操作類 c

共享記憶體操作類 using system using system.collections.generic using system.text using system.runtime.interopservices namespace sharememlib sharemem 初始化共享記憶體 ...

共享記憶體操作類 C 原始碼

vc 的共享記憶體操作 實現起來相對比較容易,但是用c 語言來實現,就有一定難度,由於工作需要,把以前vc開發的共享記憶體 要用c 實現,別說,還費了不少周折,畢竟c 操作api函式和位址指標不是那麼直接,還好,總算完成了,效果還不錯。共享記憶體操作類 using system using syst...

C 共享記憶體操作類 含原始碼

vc 的共享記憶體操作 實現起來相對比較容易,但是用c 語言來實現,就有一定難度,由於工作需要,把以前vc開發的共享記憶體 要用c 實現,別說,還費了不少周折,畢竟c 操作api函式和位址指標不是那麼直接,還好,總算完成了,效果還不錯。共享記憶體類 測試例程 using system using s...