Windows 实验总结

关于DLL的生成地址

在CreateDLL.cpp文件中,我定义了两个函数,同时这里
在这里插入图片描述
__stdcall:Windows API默认的函数调用协议。
在头文件做好相对应的定义:
在这里插入图片描述
__declspec(dllexport)

将一个函数声名为导出函数,就是说这个函数要被其他程序调用,即作为DLL的一个对外函数接口。
通常它和extern “C” 合用

这是由于在制作DLL导出函数时由于 C++ 存在函数重载,因此__declspec(dllexport) FUNCTION(int,int) 在DLL会被decorate,例如被decorate成为 function_int_int,而且不同的编译器decorate的方法不同,造成了在用GetProcAddress取得FUNCTION地址时的不便,使用extern "C"时,上述的decorate不会发生,因为C没有函数重载,如此一来被extern"C"修饰的函数,就不具备重载能力

(1)C编译器的函数名修饰规则
对于__stdcall调用约定,编译器和链接器会在输出函数名前加上一个下划线前缀函数名后面加上一个“@”符号和其参数的字节数

(2)C++编译器的函数名修饰规则
C++的函数名修饰规则有些复杂,但是信息更充分,通过分析修饰名不仅能够知道函数的调用方式,返回值类型,甚至参数个数、参数类型。

同时针对上面的,无论是添加extern "C"还是不添加,都不是我们想要的函数名,.h头文件的作用仅仅能导出动态库、明确编译链接方式及确定入口点约定,还一个重要作用是打包给开发者,使其了解动态库导出的函数及对应的的参数,为了确保导出函数名及入口点函数不变,此时需添加.def文件

使用def文件的意义
将编译器生成的函数修饰去掉,用更加自然、更加容易理解、更加容易记忆的名字来命名函数

def文件导出的动态库DLL既可以保证函数名不变也可以保证动态库DLL的入口点函数名不变,同时在.cpp文件中函数定义中加入__stdcall就可以实现导出的DLL被其它语言调用,此时.h头文件的作用仅仅打包给开发者,供其查看导出的函数名及相应参数而已

先将解决方案切换到Release模式,再生成项目

默认情况下,项目属性的设置的目录起点为项目配置文件所在的位置,实际上就是项目头文件和源文件所在的位置。

C++项目,则解决方案总目录下包含一个项目文件夹,在vs编译器中生成debug和release解决方案后,总目录下还会生成对应的debug和release目录,存放最终生成的exe或dll文件,同时也会在项目文件夹下生成debug和release目录(存放的是中间编译文件obj)。
在这里插入图片描述
在vs2010的项目属性页,会有一些系统变量,如下:
SolutionDir:解决方案目录
Configuration:指debug或release
ProjectName:项目名字
OutDir:在 常规–输出目录 中定义的值,如 ( S o l u t i o n D i r ) (SolutionDir) (SolutionDir)(Configuration)\,表示XXX\lolution\debug\目录值
IntDir:中间目录
TargetDir:生成exe或dll文件所在位置,如链接器-常规-输出文件为 ( O u t D i r ) (OutDir) (OutDir)(TargetName)$(TargetExt)(即定义了exe输出位置,也就决定了TargetDit的值),此时TargetDir表示在XXX\lolution\debug
TargetName:目标输出名,不包括扩展名
TargetPath:目标输出文件的全路径名
ProjectDir:表示项目目录值,一般在“调试-工作目录”中设置该值
TargetExt:扩展名
PlatformToolsetVersion:
ConfigurationName:配置名字,通常是Debug或者Release

关于Windos消息机制

FindWindow用法
函数功能:该函数获得一个顶层窗口的句柄,该窗口的类名和窗口名与给定的字符串相匹配。这个函数不查找子窗口。在查找时不区分大小写。
函数型:HWND FindWindow(LPCTSTR IpClassName,LPCTSTR IpWindowName);
参数
IpClassName :指向一个指定了类名的空结束字符串,或一个标识类名字符串的成员的指针。如果该参数为一个成员,则它必须为前次调用theGlobafAddAtom函数产生的全局成员。该成员为16位,必须位于IpClassName的低 16位,高位必须为 0。
IpWindowName:指向一个指定了窗口名(窗口标题)的空结束字符串。如果该参数为空,则为所有窗口全匹配
返回值:如果函数成功,返回值为具有指定类名和窗口名的窗口句柄;如果函数失败,返回值为NULL。
C#中使用该函数首先导入命名空间:
在这里插入图片描述
如果接收者的Text中不是在sender中定义的
在这里插入图片描述
在这里插入图片描述
SendMessage使用方法
函数功能:该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回。而函数PostMessage不同,将一个消息寄送到一个线程的消息队列后立即返回。
函数原型
LRESULT SendMessage(HWND hWnd,UINT wMsg,WPARAM wParam,LPARAM IParam)
参数:
hWnd:其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。
wMsg用于区别其他消息的常量值,这些常量可以是Windows单元中预定义的常量,也可以是自定义的常量.
wParam通常是一个与消息有关的常量值,也可能是窗口或控件的句柄
lParam通常是一个指向内存中数据的指针。由于WParm、lParam和Pointer都是32位的,因此,它们之间可以相互转换
返回值:返回值指定消息处理的结果,依赖于所发送的消息。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值