心念旧安,夙夜忧叹。

API和句柄(MSDN)

上一篇 / 下一篇  2007-08-18 20:45:54 / 个人分类:转贴好文

什么是 API?

51Testing软件测试网 jj&V^~*M*D

API 就是应用程序编程接口。它是能用来操作组件、应用程序或者操作系统的一组函数。典型的情况下,API 由一个或多个提供某种特殊功能的 DLL 组成。

q!r:Ib\MG J7LxZ0

^]?.M/eH Z)wM h2GP0DLL 是一个文件,其中包含了在 Microsoft® Windows® 下运行的任何应用程序都可调用的函数。运行时,DLL 中的函数动态地链接到调用它的应用程序中。无论有多少应用程序调用 DLL 中的某个函数,在磁盘上只有一个文件包含该函数,且只在它调入内存时才创建该 DLL。

0Y4W_-BgJ051Testing软件测试网Ehv+P6Te

您听到最多的 API 可能是 Windows API,它包括构成 Windows 操作系统的各种 DLL。每个 Windows 应用程序都直接或间接地与 Windows API 互动。Windows API 保证 Windows 下运行的所有应用程序的行为方式一致。

lLu.G4ou^[4cy ~0
注意   随着 Windows 操作系统的发展,现已发布了几个版本的 Windows API。Windows 3.1 使用 Win16 API。Microsoft® Windows NT®、Windows 95 和 Windows 98 平台使用 Microsoft® Win32® API。

}.['{7P6M0除 Windows API 外,其他一些 API 也已发布。例如,邮件应用程序编程接口 (MAPI) 是一组可用于编写电子邮件应用程序的 DLL。

"IALE2J!LfW051Testing软件测试网/j E9FW mO1W)O.J

API 传统上是为开发 Windows 应用程序的 C 和 C++ 程序员编写的,但其他的编程语言(包括VBA)也可以调用 DLL 中的函数。因为大部分 DLL 主要是为 C 和 C++ 程序员编写和整理说明的,所以调用 DLL 函数的方法与调用 VBA 函数会有所不同。在使用 API 时必须了解如何给 DLL 函数传递参数。51Testing软件测试网2D2u%|Pli!L

警告   调用 Windows API 和 其他 DLL 函数可能会给您的应用程序带来不良影响。从自己的代码中直接调用 DLL 函数时,您绕过了 VBA 通常提供的一些安全机制。如果在定义或调用 DLL 函数时出现错误(所有程序员都不可避免),可能会在应用程序中引起应用程序错误(也称为通用性保护错误,或 GPF)。最好的解决办法是在运行代码以前保存该项目,并确保了解 DLL 函数调用的原理。

{(^2@8@d)Th1m%R.Hg%o0 

)CG~R9Y8{0

了解句柄51Testing软件测试网v(}G-AS:B,c

51Testing软件测试网[:O Y i-f ^D(D

在调用 DLL 函数前必须理解的另外一个重要概念是句柄。句柄是一个 32 位的正整数,Microsoft® Windows® 用它来识别窗体或其他对象,例如字体或位图。

OTCd[V L|0

AX(KY"q Q*ee0在 Windows 中,窗口可以有许多种。窗口可以是屏幕上的一块矩形封闭区域,比如您熟悉的应用程序窗口。窗体上的控件(例如列表框或滚动条)也可以是窗口,但并不是所有类型的控件都是窗口。桌面上的图标和桌面本身也是窗口。

azm;w8L051Testing软件测试网:P+n?4p7b1r7Z9O

因为所有这些类型的对象都是窗口,所以 Windows 可以用类似的方式处理它们。Windows 给每个窗口一个唯一的句柄,通过句柄操纵该窗口。许多 API 函数可返回句柄或者接受句柄作参数。51Testing软件测试网3j.| Nl U4P)i_\

51Testing软件测试网-}Nf`'J T9Q7I

创建窗口时,Windows 给它指派一个句柄,窗口消失后句柄被释放。虽然句柄在窗口的整个生存期内保持不变,但不能保证某窗口在被损坏并重新创建后还使用原来的句柄。所以,如果在变量中存储了一个句柄,请记住窗口损坏后句柄就失效了。

)Uzp%fQ051Testing软件测试网]6yY;[1]

例如 GetActiveWindow 函数就可以返回窗口的句柄,这里的窗口是一个当前活动的应用程序窗口。GetWindowText 函数接受窗口的句柄,如果该窗口有标题,则返回标题。下面的过程用 GetActiveWindow 返回活动窗口的句柄,用 GetWindowText 返回该窗口的标题:

E"@Z2OQu-f0
Declare Function GetActiveWindow Lib "user32" () As Long
Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _
    (ByVal Hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long

Function ActiveWindowCaption() As String
   Dim strCaption As String
   Dim lngLen   As Long
   
   ' 创建由空字符填充的字符串。
   strCaption = String$(255, vbNullChar)
   ' 返回字符串长度。
   lngLen = Len(strCaption)

   ' 调用 GetActiveWindow,返回活动窗口的句柄,
   ' 把句柄连同字符串和字符串长度一起传递给 GetWindowText。
   If (GetWindowText(GetActiveWindow, strCaption, lngLen) > 0) Then
      ' 返回 Windows 写到字符串中的值。
      ActiveWindowCaption = strCaption
   End If
End Function

:L#lt J/vIM(C,g3QwU0GetWindowText 函数有 3 个参数:窗口句柄;准备接受窗口标题的 NULL 结束字符串;以及该字符串的长度。

:t$HLDC051Testing软件测试网6T6i%LLZ*VFd

===================51Testing软件测试网.LCH o1dF`5H8^ ]

51Testing软件测试网)wd:P/tuY~{

http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/modcore/html/deovrunderstandinghandles.asp51Testing软件测试网M;Qh0an3uaG,v0E


TAG: 转贴好文

 

评分:0

我来说两句

日历

« 2024-03-31  
     12
3456789
10111213141516
17181920212223
24252627282930
31      

数据统计

  • 访问量: 453304
  • 日志数: 138
  • 图片数: 4
  • 建立时间: 2006-11-26
  • 更新时间: 2013-08-30

RSS订阅

Open Toolbar