VarPtr 得到位址 指標

2022-10-11 17:12:12 字數 2112 閱讀 5055

在basic語言演變成qbasic,然後到visual basic之前,varptr函式就已經存在了。開始,這個函式存在於vb執行庫1.0版中。通過宣告可以呼叫這個函式:

declare function varptr lib "vbrun100.dll" (var as any) as long

dim l as long

debug.print varptr(l)

類似地,為了獲取字串的指標,而非儲存字串的變數的指標,只須在變數名前加上byval即可。如:

debug.print varptr(s),varptr(byval s)

在vb3之前,用這種方法來獲取字串緩衝的指標是非常普遍的。但在vb4卻遇到了一點麻煩。

ansi/unidcode問題

隨著32位世界和vb4的到來,我們邁進了一半是unicode,一半是ansi的windows世界。而在此之前,是ansi一統天下。在vb中,所有字串按unicode儲存,但所有的api呼叫卻仍使用ansi字串。這就要求在呼叫api函式之前,將字串從unicode轉換成ansi,函式執行結束後,將返回的字串從ansi轉換成unicode。雖然大多數時候這種轉換對使用者來說是透明的,但這就使利我們不能將乙個字串型別的引數以unicode方式從vb傳遞給dll。類似地,任何包含有字串的結構在執行api呼叫時,也必須經過這種雙重轉換。

這種差異是如何影響varptr函式的呢?當乙個字串傳遞給varptr函式時,函式執行後所返回的位址是儲存臨時ansi字串的臨時ansi字串或變數的位址。換句話說,這個位址並不是你宣告的變數的真正位址。因此,對於字串變數以及包括字串的結構來講,這個函式一點用也沒有。

vb5來解決問題

為了能varptr能重新發揮作用,vb5(及office97)加入了三個針對vba型別庫的入口點。這些入口點為varptr函式提供了內建的宣告。這三個函式的作用是:

varptr其函式原型如下,用oleview開啟c:\windows\system32\msvbvm60.dll可知:

[entry(0x60000006), hidden]

long _stdcall varptr([in] void* ptr);

請看下兩個例子:

例一:dim s as long:s=-11                 『為非指標型變數均可,如byte等,會轉化成long。

msgbox varptr(s)                      『得到變數s的位址

msgbox varptr(-11)                   『得到臨時變數的位址

msgbox varptr(byval s)            『不用建立臨時變數,結果為-11。如果varptr為取址,肯定不會為-11;此處不取址了,僅轉化值。

例二:dim s as string:s=」asdfg」

msgbox varptr(s)                      『得到變數s的位址

msgbox varptr(「asdfg」)            『得到臨時變數的位址

msgbox varptr(byval s)            『得到字串」asdfg」的位址

上面兩例的結果均為long型,且前兩個位址數值相近,因均屬變數型,而最後乙個為常量。

vb不鼓勵使用指標,比如msgbox s,單獨用變數名s,就是無法得位址。varptr的最大作用,當然是突破限制、「摳」出了變數的指標數值。那「數值轉化」有什麼用呢?其實沒什麼特別。我們來自己定義個varptr,在例一中加上private declare function varptr lib "msvbvm60.dll" (x as any) as integer,會進行long與integer的轉換。

再看例三,三個msgbox的結果相同:

例三:dim s as long:s = -11

msgbox varptr(s)

msgbox varptr(byval varptr(s))       『不可省去byval,那會是臨時變數的位址

dim t as long

t = varptr(s)

msgbox varptr(byval t)

end可以看出,實參中byval varptr(x)的搭配和(byref) x一樣;varptr(byval x)和x一樣。

得到本機mac位址

include include pragma comment lib,iphlpapi.lib int tmain int argc,tchar argv if dwretval getadaptersinfo padapterinfo,uloutbuflen no error printf ada...

得到本機IP位址

方法1 通過網域名稱得到 目標板沒有網域名稱,無法取得 void print ip lst while hp h addr list id null 方法2 ioctl 已驗證 include include int get ip address r1 char ip,char netmask io...

正確的得到Mac位址

網上有很多獲取mac位址的方法,但是好多沒法使用,我就把今天測試到可以使用的方法記錄下來,省去以後再測試的時間 1 通過wifi獲取mac位址,這個是最簡單的,網上很容易找到 public static string getlocalmacaddressfromwifiinfo context co...