ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 3533|回复: 4

[转帖] 什么是WinAPI

[复制链接]

TA的精华主题

TA的得分主题

发表于 2012-12-22 20:50 | 显示全部楼层 |阅读模式
本帖最后由 引子玄 于 2012-12-22 20:56 编辑

什么是WinAPI (1)


       视窗操作系统应用程序接口(Windows API),有非正式的简称法为WinAPI,是微软对于Windows操作系统中可用的内核应用程序编程接口的称法。它设计为由C/C++程序调用,而且它也是应用软件与Windows系统最直接的交互方式。而大多数驱动程序所需要的对Windows系统的更底层次访问接口,由所用版本的Windows的Native API来提供接口。
        Windows有一个软件开发包(SDK, software development kit)提供相应的文档和工具,以使程序员开发使用Windows API的软件和利用Windows技术。

历史
        Windows API总会为程序员提供大量的构建不同Windows的底层结构,这有助于为Windows程序员开发应用程序提供大量的灵活性和功能。但是,它同样使Windows applications要负责处理大量底层且有时是繁琐的与图形用户界面(GUI)相关的操作。
       Charles Petzold, 许多有关Windows API的畅销书的作者曾经说过:[1]

“ The original hello-world program in the Windows 1.0 SDK was a bit of a scandal. HELLO.C was about 150 lines long, and the HELLO.RC resource script had another 20 or so more lines. (...) Veteran C programmers often curled up in horror or laughter when encountering the Windows hello-world program. ”
—Charles Petzold, Programming Microsoft Windows with C#

        常用的例子程序Hello world程序,通常是用来演示一个系统上最简单的程序(即打印一行"Hello World")。
        这些年来,Windows操作系统已经今非昔比,而Windows API也随之改变和成长并反映出这种变化。Windows API的 Windows 1.0 版本只提供不到450个函数调用(Subroutine),而现在的版本提供了上千个。然而,整体而言,Windows接口保持了相当好的一致性,古老的Windows 1.0程序对习惯于现在版本Windows API的程序员也并不陌生。[2]
Microsoft特别强调维持软件的向后兼容性。为了实现此一目标,有时微软甚至不惜支持使用了非官方乃至(编程上)非法的API的软件。Raymond Chen,一位致力于Windows API的Windows开发者,曾提及他:[3]

“ could probably write for months solely about bad things apps do and what we had to do to get them to work again (often in spite of themselves). Which is why I get particularly furious when people accuse Microsoft of maliciously breaking applications during OS upgrades. If any application failed to run on Windows 95, I took it as a personal failure. ”
—Raymond Chen, What about BOZOSLIVEHERE and TABTHETEXTOUTFORWIMPS?

Windows API分类
Windows API所提供的功能可以归为七类:[4]
       基础服务(Base Services)[5],提供对Windows系统可用的基础资源的访问接口。比如象:文件系统(file system)、外部设备(device)、, 进程(process)、线程(thread)以及访问注册表(Windows registry)和错误处理机制(error handling)。这些功能接口位于,16位Windows下的kernel.exe、krnl286.exe或krnl386.exe系统文件中;以及32位Windows下的 kernel32.dll和advapi32.dll中。
      图形设备接口(GDI)[6],提供功能为:输出图形内容到显示器、打印机以及其他外部输出设备。它位于16位Windows下的gdi.exe;以及32位Windows下的gdi32.dll。
       图形化用户界面(GUI)[7],提供的功能有创建和管理屏幕和大多数基本控件(control),比如按钮和滚动条。接收鼠标和键盘输入,以及其他与GUI有关的功能。这些调用接口位于:16位Windows下的user.exe, 以及32位Windows下的user32.dll。从Windows XP版本之后, 基本控件和通用对话框控件(Common Control Library)的调用接口放在comctl32.dll中。
       通用对话框链接库(Common Dialog Box Library)[8],为应用程序提供标准对话框,比如打开/保存文件对话框、颜色对画框和字体对话框等等。这个链接库位于:16位Windows下的commdlg.dll中,以及32位Windows下comdlg32.dll中。它被归类为User Interface API之下。
        通用控件链接库(Common Control Library)[9],为应用程序提供接口来访问操作系统提供的一些高级控件。比如像:状态栏(status bar)、进度条(progress bars)、工具栏(toolbar)和标签(tab)。这个链接库位于:16位Windows下的commctrl.dll中,以及32位Windows下comctl32.dll中。. 它被归类为User Interface API之下。
Windows外壳(Windows Shell)[10][11],作为Windows API的组成部分,不仅允许应用程序访问操作系统shell提供的功能,还对之有所改进和增强。它位于16位Windows下的shell.dll中,以及32位Windows下的shell32.dll中(Windows 95则在 shlwapi.dll中)。 它被归类为User Interface API之下。
        网络服务(Network Services)[12],为访问操作系统提供的多种网络 功能提供接口。它包括NetBIOS、Winsock、NetDDE及RPC等。

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-12-22 20:53 | 显示全部楼层
本帖最后由 引子玄 于 2012-12-22 21:06 编辑

什么是WinAPI(2)

Web相关API
        Internet Explorer网页浏览器也提供许多程序接口 [13],它将不会在Windows Vista中集成,特别提供以下接口:
        可嵌入的网页浏览器控件,位于shdocvw.dll和mshtml.dll之中。
        urlmon.dll中的命名服务(URL moniters service),利用COM对象为应用程序提供解析URL服务。应用程序也可以为其他程序提供自己的URL处理程序。
        一个支持多种语言文本的链接库(mlang.dll)。
        DirectX Transforms,一组图像过滤组件。
        XML支持(MSXML组件)。
        访问Windows Address Book。

多媒体相关API
        自从Windows 95 OSR2以来,Microsoft把DirectX API 作为Windows安装的一部分。DirectX提供一组松散相关的多媒体和游戏服务,包括:
       Direct3D可以作为OpenGL的替代,来访问3D加速硬件。
       DirectDraw提供硬件加速2D framebuffer(帧缓冲)访问接口。自DirectX 9以来,相比Direct3D更倾向于后者,因为Direct3D提供更全面的高性能图形功能(毕竟2D渲染只是3D渲染的子集)。
       DirectSound提供底层次的硬件加速声卡访问。
       DirectInput用来与输入设备(摇杆和gamepad)进行通信。
       DirectPlay提供一个多人游戏的架构(multiplayer gaming infrastructure)。它已经被DirectX 9所替代,Microsoft不建议用它进行游戏开发。
       DirectShow可以创建和运行一般的多媒体管道(generic multimedia pipelines)。它可以与GStreamer框架相媲美,并且经常被用来渲染游戏视频和创建media players(Windows Media Player正是基于此)。DirectShow不被建议进行游戏开发。
       DirectMusic

程序通信API
        Windows API的功能主要通过使操作系统和应用程序之间的交互来实现。为了实现不同Windows应用程序的通信,微软随着主要Windows API,推出一系列的技术。最初的DDE(Dynamic Data Exchange)升级为对象连接与嵌入(Object Linking and Embedding),再后来是组件对象模型(COM)。

封装库
       微软利用许多更底层的Windows API函数,开发出许多封装库(wrapper),让应用程序以更抽象的方式与Windows API进行交互。MFC(Microsoft Foundation Class Library)用C++ 类来封装Windows API的功能,因而允许用更为面向对象的方式与API进行交互。ATL(Active Template Library)是对COM的面向模板(template oriented)的封装。WTL(Windows Template Library)作为ATL的增强,被用来作为MFC的轻型的替代物。
       其他著名的封装库是Borland公司的产品,为了与MFC竞争而推出的OWL(Object Windows Library)提供了类似的面向对象封装。不久Borland又推出VCL(Visual Component Library)来取而代之。
        大多数的Windows 程序框架(application framework)是对Windows API的封装,因而.NET Framework、Java以及其他在Windows下的程序语言,都是(或者包含)封装库。

其它实现
       尽管微软的Windows API实现有版权保护,但被普遍认可的是,根据美国的法律先例,其他厂商仍然可以通过提供一致的API来模拟Windows,而不会侵犯版权。
        Wine是为Unix类平台提供Win32 API兼容层的尝试。ReactOS走得更远,提供了整个Windows操作系统的模拟,与Wine项目紧密结合,以便促进代码重用和兼容。HX DOS-Extender是另一个模拟Windows API的项目,允许通过DOS命令行来运行简单的Windows程序。

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-12-22 20:54 | 显示全部楼层
本帖最后由 引子玄 于 2012-12-22 21:07 编辑

什么是WinAPI(3)

编译器支持
       为了开发使用 Windows API的软件,编译器必须能处理和导入微软相关的DLLs和COM对象。编译器必须接受一种C或C++方言,并处理揭示了内部API函数名称的接口定义语言(Interface description language)文件和头文件。概括而言,这些预备条件(编译器、开发工具、库和头文件)被统称为Microsoft Platform SDK。很长时间以来,包含了编译器和开发工具的专利产品如Microsoft Visual Studio系列和Borland编译器(尽管至少在Windows下,SDK是可以从整个IDE环境中剥离出来单独免费下载的,据 Microsoft Platform SDK Update),是仅有的能提供整套开发环境的选择。如今MinGW和Cygwin也能提供一套这样的开发环境——是基于采用一种独立头文件集合来保证能与微软DLL连接的GCC。LCC-Win32是由Jacob Navia维护的一种“非商业用途免费”的C编译器。Pellesc是由Pelle Orinius维护的一种免费C编译器。MASM32是一个成熟的项目,它通过自制或由SDK平台转换的头文件和库,并利用32位微软汇编器来实现支持Windows API。
       微软相关的编译器支持也是异常处理(Structured Exception Handling)特性所需要的。这个体制有双重目的:它提供了语言相关的异常处理赖以实现的基础,同时也是内核藉以通知程序发生诸如解除一个非法指针的引用或堆栈溢出之类异常状况的渠道。甫一被引入Windows 95和NT,微软/Borland C++编译器就有使用这种体制的能力,然而实际实现未被公开,而且必须经过反向工程方可用于Wine项目和免费编译器。SEH的运行机制是先把异常的句柄推入堆栈,继而将它们添加到存储于线程本地资源(即线程环境块的首字段)的一个链表里。事实上,每一个未有程序本身处理的异常,都将由会弹出常规Windows崩溃对话框的默认backstop处理器处理。
       API在Visual Basic中的实现示例(这个简化的例子使得用户可以让命令按钮在窗体上四处移动):
Private Const WM_NCLBUTTONDOWN As Long = &HA1&
Private Const HTCAPTION As Long = 2&
Private Declare Function ReleaseCapture Lib "user32" () As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd&, ByVal wMsg&, wParam As Any, lParam As Any) As Long
If Command1.MousePointer = 14 Then
  Call ReleaseCapture
  Call SendMessage(Command1.hWnd, WM_NCLBUTTONDOWN, ByVal HTCAPTION, ByVal 0&)
End If


(完)
http://www.bianceng.cn/Programming/cplus/201104/25452.htm

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-12-22 22:36 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 引子玄 于 2012-12-22 22:40 编辑

剪贴板的API操作

OpenClipboard函数




多个软件之间进行数据共享是非常重要的,难以想像编辑软件没有CTRL+C,CTRL+V的功能,是多么的不方便。很多的操作,就是拷贝的动作,就是为了数据共享。剪贴板共享是Windows里比较重要的功能,比如很多采集数据的软件为了方便导数据到excel里面,就可以使用剪贴板的功能。还有即见即所得的界面导到word里面,也可以使用剪贴板的功能。

函数OpenClipboard声明如下:
WINUSERAPI
BOOL
WINAPI
OpenClipboard(
    __in_opt HWND hWndNewOwner);

hWndNewOwner是前贴板所属于的窗口。

调用函数的例子如下:
#001 //拷贝数据到剪贴板。
#002  //蔡军生 2007/12/09 <a href="http://tech.ddvip.com/qq/index.html" target="_blank">qq</a>:9073204 深圳
#003  void TestClipBoard(void)
#004  
{
#005         //打开剪贴板并清空。

#006        if (OpenClipboard(m_hWnd) &&
#007               
EmptyClipboard())
#008         
{
#009               
//
#010               HGLOBAL 
hMem;
#011               std::wstring strText(_T("拷贝数据到剪贴板
"));
#012              

#013               //分配全局内存。
#014               hMem = GlobalAlloc(GMEM_MOVEABLE,
#015                    (strText.length() + 1) * 
sizeof(TCHAR));
#016               if (hMem == 
NULL)
#017               
{
#018                    
CloseClipboard();
#019                    
return;
#020               }   

#021 
#022               //拷贝数据到剪贴板内存。
#023               LPTSTR lpStr = (LPTSTR)GlobalLock(hMem);
#024               memcpy(lpStr, 
strText.c_str(),
#025                    strText.length() * 
sizeof(TCHAR));
#026               lpStr[strText.length()] = (TCHAR) 
0;
#027               
GlobalUnlock(hMem);
#028 

#029               //设置数据到剪贴板
#030               SetClipboardData(CF_UNICODETEXT, hMem);
#031 

#032               //关闭剪贴板。
#033               CloseClipboard();
#034         
}
#035  
}
#036 


GetClipboardData




前面介绍怎么样把数据放到剪贴板里面,那么又是怎么样从剪贴板里面获取数据出来呢?当然还是需要使用其它的API函数来获取剪贴板里的数据。获取剪贴板里的数据时,是不知道当前剪贴板里是否有数据的,也不知道剪贴板里的数据格式是什么。那么下面就来解决这两个问题,先使用函数IsClipboardFormatAvailable来获取剪贴板里的格式是否可以处理,接着使用函数OpenClipboard打开剪贴板,然后使用函数GetClipboardData来获取剪贴板数据。

函数GetClipboardData声明如下:
WINUSERAPI
HANDLE
WINAPI
GetClipboardData(
    __in UINT uFormat);

uFormat是剪贴板的格式。

调用函数的例子如下:
#001 //获取剪贴板的数据。
#002  //蔡军生 2007/12/10 <a href="http://tech.ddvip.com/qq/index.html" target="_blank">qq</a>:9073204 深圳
#003  void TestGetClipBoard(void)
#004  
{
#005         //判断剪贴板的数据格式是否可以处理。

#006         if (!IsClipboardFormatAvailable(CF_UNICODETEXT))
#007         
{
#008               
return;
#009         }   

#010 
#011         //打开剪贴板。
#012         if (!OpenClipboard(m_hWnd))
#013         
{
#014               
return;
#015         }   

#016 
#017         //获取UNICODE的数据。
#018        HGLOBAL hMem = GetClipboardData(CF_UNICODETEXT);
#019         if (hMem != 
NULL)
#020         
{
#021               //获取UNICODE的字符串。

#022               LPTSTR lpStr = (LPTSTR)GlobalLock(hMem);
#023               if (lpStr != 
NULL)
#024               
{
#025                    //显示输出。

#026                    OutputDebugString(lpStr);
#027 

#028                    //释放锁内存。
#029                    GlobalUnlock(hMem);
#030               
}
#031         
}
#032 

#033         //关闭剪贴板。
#034         CloseClipboard();
#035  }

TA的精华主题

TA的得分主题

发表于 2016-9-20 10:02 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
好贴,收藏,感谢。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-18 22:50 , Processed in 0.032933 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表