动态链接
Windows工作原理的中心思想就是“动态链接”概念。Windows自身带有一大套函数应用程序就是通过调用这些函数来实现它的用户界面和在屏幕上显示文本与图形的。这些函数都是在动态链接库里实现的。这些文件的名称都带有后缀.DLL,或有时带有后缀.EXE在 Windows98 中,这些文件通常放在 \WINDOWS\SYSTEM 子目录下,而在WindowsNT中,则放在 \WINNT\SYSTEM和 \WINNT\SYSTEM32子目录下
早期Windows的大部分只是实现了3个动态链接库。它们分别代表了 Windows的3个主要的子系统,即内核(kernel)、 用户(user) 以及 GDI
lib和dll
当链接Windows程序以生成执行文件时,一定得链接你的编程环境所提供的特殊的 “导入库”(import library)。这些导入库包含所有 Windows函数调用要碰到的 动态链接库(dll) 的名字及引用信息。链接程序利用这些信息构建EXE 文件中的表格,当装入程序的时候,Windows要靠这些表格来解析Windows函数调用
第一个Windows程序
注意:开发环境为VS 2022
#include <Windows.h>
int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR szCmdLine, _In_ int iCmdShow)
{
MessageBox(NULL, TEXT("text"), TEXT("text1"), MB_YESNOCANCEL);
return 0;
}
编译错误
MSVCRTD.lib(exe_main.obj) : error LNK2019: 无法解析的外部符号 _main,该符号在函数 "int __cdec
主要原因是因为windows程序的话,WinMain是入口函数,而控制台程序,那么main是入口函数,此时没有配置为windows程序,导致入口函数错误
需要进行如下修改:
- 右键解决方案中的方案,选择属性
- 在左边栏中依次选择:配置属性 -> C/C++ -> 预处理器,然后在右边栏的预处理器定义对应的项中删除 _CONSOLE, 添加 _WINDOWS
- 在左边栏中依次选择:配置属性 -> 链接器 -> 系统,然后在右边栏的 子系统对应的项改为 窗口(/SUBSYSTEM:WINDOWS)
注意:属性中有平台选项,选项值对应调试中的对应选项,不要出现属性平台选项修改了Win32的,然后调试却在使用x64的问题