以下是乙個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...