图解啥是API,C++如何调用系统API

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图解啥是API,C++如何调用系统API相关的知识,希望对你有一定的参考价值。

首先,要知道:操作系统与用户间的接口有两种,一种是命令接口,另一种是程序接口。什么是命令接口: 为了便于用户直接或者间接地控制自己的作业,操作系统向用户提供了命令接口,用户可以通过该接口向作业发出命令以控制作业的运行。该接口又进一步分为联机用户接口和脱机用户接口。(参考资料:《计算机操作系统》 第三版 汤小丹编著 西安电子科技大学出版社 23页)什么是程序接口: 程序接口是提供给程序员在编程时使用的接口,是用户的程序取得操作系统服务的唯一途径。可以说,程序接口是为用户程序在执行中访问系统资源而设置的。程序接口由一组系统调用命令(简称系统调用)组成。用户通过在程序中使用这些系统调用命令来请求操作系统提供服务。系统调用详解:系统调用就是用户在程序中调用操作系统所提供的一些子功能,每一个系统调用都是一个能完成特定功能的子程序。具体讲,系统调用就是通过系统调用命令中断现行的用户程序,而转去执行相应的子程序,以完成特定的系统功能;系统调用完成后,控制又返回到系统调用命令的下条指令,被中断的程序将继续执行下去。需要注意的是:系统调用的执行是在管态下运行的。Windows系统调用:Windows操作系统提供了丰富的系统调用,这些系统调用又被进一步编写成不同的库函数后放入动态链接库DLL(DLL是动态链接库的英文缩写,全称是是Dynamic Link Library)中,这些库函数构成了Windows操作系统提供给程序员的编程界面,这个编程界面被称为应用编程接口API。库函数:百科上的解释是:库函数顾名思义是把函数放到库里..是别人把一些常用到的函数编完放到一个文件里,供别人用。别人用的时候把它所在的文件名用#include<>加到里面就可以了。库分动态链接库和静态链接库。这些库是通过编译连接生成的(在编译软件里,可以设置文件生成库文件还是普通的EXE文件)。其实库函数就好比是在word文件里写了几篇作文,然后保存成一个word文档,那么这个word文档就相当于一个库,里面的每一篇作文都是一个库函数。动态链接库的英文缩写是DLL,Windows中,动态链接库一般被存放在C:\Windows\System目录下,DLL多数情况下是带有DLL扩展名的文件,但也可能是EXE或其他扩展名。所以说:API函数可以看做是一些函数,在windows操作系统下,这些函数通常存放在动态链接库中,其头文件通常包含在windows.h中(windows.h是VC 或者VS中带的)。这些存放在动态链接库里的API函数是操作系统与用户程序之间的唯一接口,用户程序只能通过这些库函数(API函数)请求操作系统服务,即用户程序只能通过这些存放在动态链接库里的API函数来实现系统调用。当用户程序中使用了这些API函数时,通常会发生系统调用,操作系统进入管态下运行,系统调用结束后,再返回到用户程序继续往下执行。其实,C语言中最常用的printf和scanf函数,最后都是通过系统调用来完成的不止这两个函数,其实C语言的标准库函数,很多都是通过系统调用实现的。而要使用系统调用,windows下必然要使用存放在动态链接库里的API函数。当然,我们在程序中也可以不采用系统调用,因为没人规定你必须使用系统调用(当然,有时候采用系统调用会简单的多)。比如完成一个简单的加法运算程序,又比如单片机C语言编程,都没有系统调用。 许多应用软件,安装后,在其目录文件夹里通常会有一些DLL文件,这些DLL就是给该软件来调用的。网上对API的解释如下: API是系统的基石,是Windows的一砖一瓦。明确一个概念,软件是运行在系统平台的支持上的,软件的功能其实就是向系统伸请,并由系统完成这些功能的过程。那么软件要做的事情如何传递给系统呢,也就是这些API的作用了,系统定义了这些API函数,做为支持软件执行系统功能的接口。不同的操作系统自然API会是不同的.mfc就是对api的封装啊.就是很好的例子,候杰的深入浅出mfc正是讲这些原理的. 参考技术A 打个比方来说吧,操作系统就是个房子,四面有墙(为保证操作系统的安全,不会因用户的误操作而挂掉),API(应用程序接口)就是盖房子的人(写操作系统的工程师)为住房子的人(写应用程序的工程师)留的一个活多个门,应用程序通过这个门(接口)才可以正常访问操作系统本回答被提问者采纳

按下回车按钮时如何使用 C++ Win32 API 调用按钮?

【中文标题】按下回车按钮时如何使用 C++ Win32 API 调用按钮?【英文标题】:How to invoke a button using C++ Win32 API when press the enter button? 【发布时间】:2012-10-22 08:54:28 【问题描述】:

我已经使用 c++ win32 API 创建了一个对话框... 有 3 个文本框、1 个组合框和 3 个按钮...

现在我有两个问题...

1.当我按下 ENTER 按钮时,它会调用第二个按钮(ID_OK)功能,但我想调用第一个按钮(ID_MYBUTTON)...

2.我正在使用代码来聚焦文本框,

SetFocus(GetDlgItem(_hwnd, IDC_NAME));

但它无法聚焦该对话框,我的意思是光标位置在那里,但无法获得任何值,当我输入时...

谁能解决?

【问题讨论】:

关于你的第一个问题,你可以让你的按钮成为默认的 ENTER 目标,而不是 OK 按钮。 仅此而已,我在问,如何制作? 它是对话框容器的一个属性:您可以设置“AcceptButton”和“CancelButton”属性来控制按下ENTER(接受)或ESC(取消)键的行为。 感谢 g-mak...我无法让您清楚...供您参考,我使用的是 c++ WIN32 API.not MFC。 匿名懦夫的回答似乎指向了正确的方向。 【参考方案1】:

这可能会回答您的两个问题: http://blogs.msdn.com/b/oldnewthing/archive/2004/08/02/205624.aspx:

使用 DM_SETDEFID 消息设置对话框中的默认按钮

使用 WM_NEXTDLGCTL 消息代替 SetFocus()

// set default button
SendMessage(_hwnd, DM_SETDEFID, (WPARAM)ID_MYBUTTON, 0);
//TODO: if the former default button's style remains, update with BM_SETSTYLE

// set focus
SendMessage(_hwnd, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(_hwnd, IDC_NAME), TRUE);

【讨论】:

@Coward...谢谢你...设置默认按钮工作正常...但是不能聚焦那个文本框......也不能聚焦那个对话框,bcz首先我按下回车按钮,不能什么都做,点击对话框后,只有默认按钮功能起作用……所以现在我想如何聚焦该对话框,然后是对话框中的文本框? 你用什么函数来创建对话框? DialogBoxIndirect()? 使用wlxDialogBoxParam()函数...启动系统时logondialogbox出现此问题。 不看代码很难判断;这可能是您的 DialogProc 中的问题。如果创建一个测试项目,直接在 WinMain 中调用 DialogBoxParam(),问题是否仍然存在? 经过一番谷歌搜索后,我发现 (1) 有同样问题的人 GINA logon dialog not in focus/active 和 (2) 可能的 solution 问题:在您的 _dialogProc 中,案例 WM_INITDIALOG 必须返回 TRUE (不是假的)。您可能必须添加 SetForegroundWindow(hwnd)。

以上是关于图解啥是API,C++如何调用系统API的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Windows 运行时使用 C# 实现 C++ API?

按下回车按钮时如何使用 C++ Win32 API 调用按钮?

Unity在Android和iOS中如何调用Native API

Paypal API 沙箱 DoAuthorization() 啥是交易 ID?

图解微信小程序---调用API操作步骤

调用旧版 C API 时,如何在现代 C++ 中正确地将指向结构的指针转换为指向其他结构的指针?