记录部分实用Win32编程知识,方便查阅
Windows系统自带,在C:\WINDOWS\system32目录下:
user32.dll – 窗口、消息、资源等APIs
gdi32.dll – 绘图相关APIs
kernel32.dll – 进程、线程、内存管理等内核APIs
VS安装目录下包含对应的导入库,导入库存放函数名和序号的对应,通过序号去找 dll 中函数地址:
user32.lib --> user32.dll 的导入库
gdi32.lib --> gdi32.dll 的导入库
kernel32.lib --> kernel32.dll 的导入库
Win32工程会默认包含这三个导入库
windows.h – 所有windows头文件的集合,已包含下面的头文件
windef.h – windows数据类型
winuser.h – user32.dll 的 APIs
wingdi.h – gdi32.dll 的 APIs
winbase.h – kernel32.dll 的 APIs
winnt.h – UNICODE字符集支持
入口函数说明如下:
int APIENTRY wWinMain( // PASCAL调用,被调用者负责清理堆栈
_In_ HINSTANCE hInstance, // 当前程序的实例句柄,是内存对象的唯一表示,并非指针
_In_opt_ HINSTANCE hPrevInstance, // 当前程序的前一个实例句柄,Win32已废弃,总为NULL
_In_ LPWSTR lpCmdLine, // 命令行参数字符串
_In_ int nCmdShow) // 窗口显示方式,最大化/最小化/正常
{
// 函数体代码:
}
如果是 C调用(缺省),则调用者负责清理堆栈#define WINAPI __stdcall
#define APIENTRY __stdcall
#define CALLBACK __stdcall
#define PASCAL __stdcall
#define WINAPIV __cdecl
差异:
1、相对于PASCAL调用,C调用 在多次调用同一个函数的情况下,内容相同的清栈代码会重复出现,编译生成的二进制模块会比较大;
2、带有变边参数表的函数,如 printf / scanf,只能使用C调用约定,应为参数个数不确定,编译器无法在被调用者中生成清栈代码;
3、无论PASCAL调用,还是C调用,参数入栈的顺序都是从右往左;
但对于 C++ 的类成员函数,最后一个入栈的是 this 指针,相当于第一个参数。
Flink批处理从文件中读取单词,计算频次Scala版本import org.apache.flink.api.scala.ExecutionEnvironmentobject BatchWordCountJob { def main(args: Array[String]) { val env = ExecutionEnvironment.getExecutionEnvi...
使用R2015a,这个问题最终得到了一个简单的答案(详情请参阅我对这个问题的其他答案 )。 对于R2015a之前的版本,有一个内置的(未记录的)函数: _mergesimpts 。 对名称组成的安全猜测是“合并相似点”。使用以下语法调用该函数:xMerged = builtin('_mergesimpts',x,tol,[type])数据阵列x是N-by-D ,其中N是点数, D是维数。 每...
SO_LINGER选项:typedef struct linger { u_short l_onoff; //开关,零或者非零 u_short l_linger; //优雅关闭最长时限 } linger; 当调用closesocket关闭套接字时,SO_LINGER将决定系统如何处理残存在套接字发送队列中的数据。处理方式无非两种:丢弃或
我们可以利用v-bind:style来绑定一些CSS内联样式。在写CSS属性名的时候,比如font-size我们可以使用驼峰式 (camelCase) fontSize或短横线分隔 (kebab-case,记得用单引号括起来) ‘font-size’<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</tit.
线程可以安排它退出时需要调用的函数,这样的函数称为线程清理处理程序,线程可以建立多个清理处理程序。处理程序记录在栈中,也就是说它们的执行顺序与它们注册时的顺序相反。 pthread_cleanup_push来注册清理函数rtn,这个函数有一个参数arg。在以下三种情形之一发生时,注册的清理函数被执行: 1)调用pthread_exit。 2)作为对取消线程请求(p
HttpWebRequest 多次请求不同网站时,由于安全协议问题。提示错误 “The underlying connection was closed: An unexpected error occurred on a send.”(基础连接已关闭:发送时发生意外错误)记录解决方法//.net 4.0 设置: ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;//.net 4.5 设置: ServicePointMa
图像分割边缘检测边缘检测的基本步骤是:平滑滤波:由于梯度计算容易受到噪声的影响,因此第一步是用滤波去除噪声。但是,降低噪声的平滑能力越强,边界强度的损失就越大。锐化滤波:为了检测边界,必须确定某点领域中灰度的变化。锐化操作加强了存在有意义的灰度局部变化位置的像素点。边缘判定:在图像中存在许多梯度不为零的点,但是对于特定应用,不是所有点都有意义。这就要求操作者根据具体情况选择和去除处理点,具体的方法包括二值化处理和过零检测等。边缘连接:将间断的边缘连接成为有意义的完整边缘,同时去除
服务器TIME_WAIT和CLOSE_WAIT区别及解决方案:http://itindex.net/detail/50213-%E6%9C%8D%E5%8A%A1%E5%99%A8-time_wait-close_wait具体的代码方面解决CLOSE_WAIT方案:http://blog.csdn.net/shootyou/article/details/6615051
FFMPEG采集摄像头数据编码MP4视频+时间水印操作系统:Ubuntu18.04ffmpeg版本:ffmpeg4.2.5摄像头:电脑自带或USB免驱摄像头水印处理:avfilter图像渲染:SDL库
用autoruns揪出流氓软件的驱动保护一、为什么流氓软件总是删不掉? 经常有网友发贴子说文件删除不掉,或者流氓软件清除不了,或者删除了相关的文件,但是马上它又出现了。现在流氓软件为了保护自己,采取的手段是五花八门,无所不用其极:进程保护,交叉感染,自启动,自我恢复,文件隐藏,进程注入,驱动保护。在我的上一篇文章中《[惊天大发现]顽固文件删除终极武器》已经告诉大家如...
//获得某月的天数 function getMonthDays(myMonth){ var monthStartDate = new Date(nowYear, myMonth, 1); var monthEndDate = new Date(nowYear, myMonth + 1, 1); ...
C++优先队列详解标签(空格分隔): ACM STL 优先队列 priority_queue优先队列:顾名思义,首先它是一个队列,但是它强调了“优先”二字,所以,已经不能算是一般意义上的队列了,它的“优先”意指取队首元素时,有一定的选择性,即根据元素的属性选择某一项值最优的出队~ 百度百科上这样描述的: 优先级队列 是不同于先进先出队列的另一种队列。每次从队列...