VB中CopyMemory用法,Excel 求助CopyMemory的使用方法

2022-08-23 08:52:52 字數 4080 閱讀 7575

1樓:匿名使用者

兩者效果並不一樣。在理解之前,你需要知道vb對於字串的處理方式。string1變數,本質上是乙個指標,指向實際的字串開頭位置,這個位置再往前的4個位元組是乙個long,表示字串的長度。

第一種,byval string2,實際效果是把string2的內容直接傳遞給copymemory(嚴格的說不是,vb有別的小動作),copymemory 的執行效果就是把string1指向的字串複製5個字元到string2指向的字串,這種寫法在vb裡是最正確的。

第二種,如果用第二種copymemory的宣告,效果就是copymemory byval varptr(string2),byval varptr(string1), 4。這樣表面上能複製,實際情況是,varptr(string2)獲得string2自身的位址而不是string2儲存的內容也就是那個指標,然後傳給函式,也就是把string1的值強制複製給了string2,執行完之後,string1、2指向同乙個位置(因為他們的值一樣)。只要別改變string1的字串內容,以後string2一直等於string1 。

但如果你寫了這句 string1=「asdf」,每次給字串賦值時vb都要重新分配記憶體,這樣,string1是個正常的變數,但string2還是指向老地方(那裡已經不屬於string1了),所以print string2顯示的一般是亂碼。

另外,每次執行這類記憶體相關的函式前要儲存,乙個粗心就導致vb崩了,重打字麻煩o(∩_∩)o~

2樓:匿名使用者

copymemory:將陣列複製到非託管記憶體,然後將非託管陣列複製回託管記憶體中。

引數如下:

destination 要複製記憶體塊的目的位址。

source   要複製記憶體塊的源位址。

length   指定要複製記憶體塊的大小,單位為位元組

返回值   該函式為void型,沒有返回值。

參考例項如下:

copymemory(p,abuffer, sizeof(abuffer));

//可以將資料複製到p, abuffer 和 p 指向不同的記憶體區 , abuffer = $29580d0 ,ip= '192.16'######,p = $29580d0 資料複製不全,資料塊長度不夠

copymemory(p,abuffer, sizeof(tarraybyte));

//可以將資料複製到p, abuffer 和 p 指向不同的記憶體區 , abuffer = $29580d0 ,ip= '192.168.1.132',p = $24680d0

3樓:匿名使用者

varptr 是vb的內部函式,表示取變數位址(指標)類似的還有varptr、strptr和objptr

byval 是按值傳遞,可當作拷貝記憶體(中的值)從這個角度出發,copymemory 兩個宣告是一致的。

好久沒有到這簽到了,呵呵。

4樓:

前者沒有byval,vb中預設是byref,本身是傳址的,所以**中傳入變數本身就行了

後者加了byval,需要傳入指向兩個變數的指標的值,所以要用varptr得到變數的記憶體位址(指標),再傳給函式

excel 求助copymemory的使用方法

5樓:匿名使用者

這個函式的宣告大體有兩種:

a: private declare sub copymemory lib "kernel32" alias "rtlmovememory" _

(destination as any, source as any, byval length as long)

b: private declare sub copymemory lib "kernel32" alias "rtlmovememory"  _

(byval destination as long, byval source as long,byval length as long)

雖然使用b有其理由,但為避免混亂,這裡使用a的宣告方式,初學者只需把a宣告拷貝到模組開頭就可以使用copymemory函式了,其他不必深究。

2. 其實這個函式本身非常簡單:

copymemory 引數2, 引數1, a

記住:引數1 ,引數2 都是記憶體一塊區域開頭的位址,這個函式的意思是:把從引數1開頭的位址,往後數a長度這麼大的區域,複製到引數2開頭的區域中。

3. 見下圖:這個函式無非是把0015f7c0(引數1)開頭的區域,紅框1處的內容,複製到以0015f7c4(引數2)開頭的區域,即紅框2處, 這裡第3個引數為4,意即複製四個位元組的內容。

vb.net copymemory 用法 5

6樓:玉言菩提

private declare sub copymemory lib "kernel32" alias "rtlmovememory" (destination as any, source as any, byval length as long)

引數destination 要複製記憶體塊的目的位址。

source   要複製記憶體塊的源位址。

length   指定要複製記憶體塊的大小,單位為位元組返回值   該函式為void型,沒有返回值。

vb6 使用copymemory直接複製陣列

7樓:匿名使用者

copymemory()函式功能描述:將一塊記憶體的資料從乙個位置複製到另乙個位置。

函式原型

void copymemory(pvoid destination,const void *source,size_t length);

引數destination  要複製記憶體塊的目的位址。

source  要複製記憶體塊的源位址。

length  指定要複製記憶體塊的大小,單位為位元組

返回值  該函式為void型,沒有返回值。

備註  如果目的塊與源塊有交疊,結果是不可預料的,使用movememory可以解決這個問題。

注意一點copymemory和movememory不過是rtlmovememory的乙個別名而已

示例**段

char szname[50]="陣雨";

char szfriend="polelf,oo";

copymemory(szname+4,szfriend,10);

outputdebugstring(szname);//輸出結果為"陣雨polelf,oo"

vb6的宣告:

private declare sub copymemory lib "kernel32" alias"rtlmovememory" (destination as any, source as any, byval length aslong)

8樓:

dim t(a) as integer

『a是乙個常數,乙個陣列的位數

t = randomnumber()

這樣是不行的,因為randomnumber函式返回的資料是動態資料不能給定長的陣列賦值.

改成以下就可以了

dim t() as integer '定義t為動態資料t = randomnumber()

c語言中 怎麼用 copymemory

9樓:匿名使用者

你說的是memcpy吧

void *memcpy ( void * destination, const void * source, size_t num );

第乙個引數是目的地的指標,第二個引數是想要被copy的資料的指標,第三個是有多少byte要copy。返回值和目的地指標一樣。

要注意目的地指標必須是分配好的空間

求大神指點 vb中copymemory怎麼把文字內容寫進去再由另外乙個程式考配出來呢

vb copymemory執行順序

10樓:網海1書生

要讀取四個位元組的內容,那麼變數應該宣告為長整型(long),不應該是整型(integer),否則會造成不可預知的後果。

VB中的elseif的用法,哪位高手能舉個例子並解釋一下,謝謝了

巨歌龍吟 1.if必以end if結束 2.elseif與else if不同 3.if then elseif end if 是 vb 中的塊結構條件語句,主要用來針對不同的情況,讓應用程式做出不同的反應。語句功能如下 if 假設情況1 then 假設情況一成立時執行的語句塊1 elseif 假設情...

VB中ListIndex的作用,vb中ListIndex屬性如何利用

表示式 list list1.listindex 返回當前選擇專案的字串。列表中的第一項是 listindex 0,listcount 始終比最大的 listindex 值大 1。對於可內以做多重選擇容的控制項,該屬性的行為取決於所選擇專案的個數。如果只選擇了乙個專案,listindex 返回該項目...

vb中msgbox的問題,VB程式設計中MsgBox怎麼用

a msgbox 必須在工資審批任務完成後才能進行更新記錄操作!請選擇是否進行更新記錄操作 vbyesno,確定更新 少了乙個逗號吧,vbyesno前面加個逗號看看看其他是沒錯的 因為你點了確定按鈕這時x才會有值呀 又因為vbokonly 1所以x 1 msgbox返回的是你按的那個按鈕 而按鈕vb...