VB与Windows API 间的呼叫技巧[2]

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 firetoucher 的 blog

      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。

本文关键:Visual Basic
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top