全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1350
推到 Plurk!
推到 Facebook!

如何修改記憶體內的資料呢??

答題得分者是:aftcast
nokialiu
一般會員


發表:3
回覆:3
積分:1
註冊:2006-07-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2006-08-29 15:22:31 IP:220.130.xxx.xxx 未訂閱

各位大大:小弟有一問

我打算利用以下程式去修改記憶體位置中的字串;但始終在執行時會跳出錯誤.想請教哪裡出了問題呢.


void __fastcall TForm1::Button1Click(TObject *Sender)
{
int len = Edit1->Text.Length();

AssignMem(Edit2->Text.c_str(),len,0x100519EC);

}
//---------------------------------------------------------------------------------------------------------------------------
void __fastcall TForm1::AssignMem( char *buf, int len,unsigned long const base_address)
{
int i;
unsigned char *ptr;
(unsigned long ) ptr = (unsigned long )(base_address);

if(ptr==NULL) ShowMessage("Ptr Error");

for(i=0;i {
*ptr = *buf;
ptr ;buf ;
}
}

justdo
高階會員


發表:2
回覆:359
積分:222
註冊:2004-08-17

發送簡訊給我
#2 引用回覆 回覆 發表時間:2006-08-29 20:06:03 IP:59.105.xxx.xxx 未訂閱
你確定 0x100519EC 這個區塊是可以寫入的嗎?
nokialiu
一般會員


發表:3
回覆:3
積分:1
註冊:2006-07-08

發送簡訊給我
#3 引用回覆 回覆 發表時間:2006-08-31 17:43:46 IP:220.130.xxx.xxx 未訂閱

不好意思..因為是初學者所以我也不太確定是否可以修改.

但實際上我卻可以用其它套的軟體去修改這個位置的資料!謝謝

aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2006-08-31 22:32:21 IP:61.228.xxx.xxx 未訂閱

不曉得你為何很確定那個位址可以Access,但若你真的很確定可以,那還有一個很嚴重的問題…
AssignMem(Edit2->Text.c_str(),len,0x100519EC);
上面那statement是錯的。是很多人都會犯的錯誤!
Edit2->Text.c_str() 這句表面上在compile的時候是可以通過檢測,但是是有問題的。因為Edit2->Text會傳回AnsiString物件而非AnsiString的reference。回傳的物件若是沒有被copy,那麼當statemnet結束時,這個物件就會被從stack釋放。這時候char * 的指標則指向一個未知的地方,即成為「野指標」。
正確的寫法應該是:
AnsiString tmp = Edit2->Text //使臨時的物件被copy至另一個物件上,即時臨時的釋放了也沒關係。
AssignMem(tmp.c_str(),len,0x100519EC);

或者用下面的寫法:
char *sz_s = new char[Edit2->Text->Length() 1];
strcpy( sz_s, Edit2->Text.c_str() );
AssignMem(sz_s,len,0x100519EC);


===================引 用 文 章===================

各位大大:小弟有一問

我打算利用以下程式去修改記憶體位置中的字串;但始終在執行時會跳出錯誤.想請教哪裡出了問題呢.


void __fastcall TForm1::Button1Click(TObject *Sender)
{
int len = Edit1->Text.Length();

AssignMem(Edit2->Text.c_str(),len,0x100519EC);

}
//---------------------------------------------------------------------------------------------------------------------------
void __fastcall TForm1::AssignMem( char *buf, int len,unsigned long const base_address)
{
int i;
unsigned char *ptr;
(unsigned long ) ptr = (unsigned long )(base_address);

if(ptr==NULL) ShowMessage("Ptr Error");

for(i=0;i {
*ptr = *buf;
ptr ;buf ;
}
}

------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
nokialiu
一般會員


發表:3
回覆:3
積分:1
註冊:2006-07-08

發送簡訊給我
#5 引用回覆 回覆 發表時間:2006-09-01 11:54:48 IP:220.130.xxx.xxx 未訂閱

首先感謝大大的詳細指正觀念!

在下真是受寵若驚,又上了一課了

只是程式每次執行到以下紅色敘述時就會發生錯誤.是指指標無法去更動嗎?真是另人百思不解!!!!

void __fastcall TForm1::AssignMem( char *buf, int len,unsigned long const base_address)
{
int i;
unsigned char *ptr;
(unsigned long ) ptr = (unsigned long )(base_address);

if(ptr==NULL) ShowMessage("Ptr Error");


for(i=0;i

{
*ptr = *buf; //這行時就會發生錯誤

ptr ;buf ;
}
}

aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2006-09-01 15:16:45 IP:61.229.xxx.xxx 未訂閱

回到原點,如果你照我上面講的做了修正還有這問題,那肯定是ptr所指的地方不是你能夠去動的。在memory中的資料不是你想動就可以動的,如果你試著寫入的地方是read only的區塊,就會出現access violation ! 你是不是看到這樣的錯誤訊息? 真的有些好奇,不知是否方便講為何你很肯定那個位址是可以被寫的?
若要為可寫的位址,那必需是屬於private block ,access mode = read/write 。若是想寫到 image block (程式碼區),那就要特別的權限與api配合。不知你想要做什麼? 感覺好像是想寫個"外掛"程式,把某些資料直接寫入另一個程序/module? 如果是那樣…那你下面的做法是肯定不會成功的。

如果方便,可以把你的功能需求說明清楚嗎? 或者把完整一點的程式碼貼上來…也許可以幫你run並追一下問題。
===================引 用 文 章===================

*ptr = *buf; //這行時就會發生錯誤

ptr ;buf ;

------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
系統時間:2024-05-13 23:55:33
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!