vb内定是使用传址呼叫,所以byref 可以省略,也就是说
func(byref param1 as type)
与
func(param1 as type)
是相同的,使用传址呼叫的方式,不外乎想将参数传给api 後将结果传回来。然而long
型态的传址呼叫在vb中又占了相当大的份量,因为32位元的指标都是long的型态,而字
串、自定型态的structure在windows api中是以指标来传递的,而指标的传递事实上也
是long值的传递,只不过传过去的long值,於win api中会将之当成address,而再配合
指标运作而得指标所指的内容,这个观念在後面会很重要。
例如:
-----------------------------------------------------------------------------
long regopenkeyex(
hkey hkey, // handle of open key
lpctstr lpszsubkey, // address of name of subkey to open
dword dwreserved, // reserved
regsam samdesired, // security access mask
phkey phkresult // address of handle of open key
);
相对应的vb 宣告
declare function regopenkeyex lib "advapi32.dll" alias "regopenkeyexa" _
(byval hkey as long, _
byval lpsubkey as string, _
byval uloptions as long, _
byval samdesired as long, _
phkresult as long) as long ’//最後一个参数是byref之宣告
-----------------------------------------------------------------------------
我们经常会想要用程式来读取registry中的资料,例如:我们想得知win95的produ
ct id该如何做呢?这里有几个观念要先清楚:首先:productid在何处呢?在
hkey_local_machine\software\microsoft\windows\currentverson下的productid。
我们要取得的便是
key 为 hkey_local_machine
subkey 为 software\microsoft\windows\currentverson
valuename 为 productid 的value
然而要取得productid的value可没那麽直接,要先取得subkey的keyhandle而key
handle的取得便是利用regquerykeyex的api 。程式部份在介绍win api字串传递时再一
并介绍。
三、 字串参数
凡是所有字串参数指标都以 byval 参数名称 as string 传。如regopenkeyex()的
第二参数 byval lpsubkey as string,便是一例。或许会问,这个例子是把subkey值传
给 win api所以用byval,没什麽大不了,其实不然,要win api传回字串时,也一定要
用byval的宣告。这是vb5字串格式(bstr)与win api标准字串格式(lpstr)不同的因素。
lpstr 字串格式是null terminate的字串,若有一字串"haha !ok!",则格式如下:
-----------------------------------------------------------------------------
address 0 1 2 3 4 5 6 7 8 9
-- -- -- -- -- -- -- -- -- --
内容 h a h a ! o k ! \0
而bstr则在字串的前面还有一个long值存字串长度,格式如下:
address 0.. 3 4 5 6 7 8 9 10 11 12 13
------ -- -- -- -- -- -- -- -- -- --
内容 9 h a h a ! o k ! \0
-----------------------------------------------------------------------------
所以了字串以byval的方式来传像不像指到bstr中第4个位置,如此一来,不就和lp
str 可以相容了吗?我想也正因为如此以byval的方式来传string可以取得win api的传
回值,(就算不是如此,至少这麽想比较记得住string要用byval的方式传)。现在又有一
个问题,window95 api的字串使用的是ascii code但vb是用unicode,unicode占两个位
元组,那麽能和winapi的字串相?所幸我们可以先不用管它,因为vb本身做了转换,即
vb传给api时,转了一次,传回时又转回 unicode,所以如果我们用的是byte array来
传字串,也可以但是要自己去转码。
。然而32位元的vb 中,字串有种格式,一个是bstr,另一个是hlstr,如果我们宣告的
串是非固定长度者,就会是bstr,反之则为hlstr。