吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3964|回复: 21
收起左侧

[系统底层] win32学习笔记一 win32 API的宽字符

  [复制链接]
huchen 发表于 2024-4-16 22:10
本帖最后由 huchen 于 2024-5-24 00:37 编辑

本人在观看滴水逆向视频而写的笔记,如有错误,还请大佬指出!!!
本系列还会更新下去,希望能帮助到更多的人!!!

之后的笔记索引



win32 API中的宽字符

什么是API

API(Application Programming Interface)应用程序接口,windows操作系统为我们提供已经实现好了的函数

几个重要DLL:

  1. kernel32.dll:最核心的功能模块,比如管理内存、进程和线程相关的函数等
  2. user32.dll:是Windows用户界面相关应用程序接口,如创建窗口和发送消息等
  3. GDI32.dll:全称是Graphical Device Interface(图形设备接口),包含用于画图和显示文本的函数

简单使用一个API

其实只要写过代码,就用API,只是不知道而已,比如printf,scanf等,一个打印,一个输入,这些也算API,需要包含stdio.h这个库,一样的

#include <windows.h>//要使用这个函数就要用这个库
int main()
{
        MessageBox(0, 0, 0, 0);
        return 0;
}

如代码所示,就是调用了一个弹窗的函数

image-20240415231137520.png

因为什么都没写,所以才啥都没有,然后看看MessageBox的定义

可以在MSDN上看,也可以在micoft上看都可以

int MessageBox(
                           HWND    hWnd,
                           LPCTSTR lpText,
                           LPCTSTR lpCaption,
            UINT    uType
);

可以看到这里参数类型,似乎不认识,其实不然,这些都是我们认识的类型换了个名字而已

比如,我是在VS2022里编译的

image-20240415232008742.png [index]

如果那个不认识,点击一下不认识的类型,按F12,就可以看到他到底是什么类型,如果还不认识,那就再来一次

hWnd,我记得是默认为0的,就不用管,是个句柄

以LPCTSTR为例

typedef LPCWSTR PCTSTR, LPCTSTR;

发现还是不认识,那就继续

typedef _Null_terminated_ CONST WCHAR *LPCWSTR, *PCWSTR;

可以发现是CONST        WCHAR类型的了,如果还是不知道,那还是一样,

CONST

#define CONST               const

WCHAR

typedef wchar_t WCHAR;    // wc,   16-bit UNICODE character

所以他真实的类型就是const wchar_t LPCTSTR,所以不要被这些类型给迷惑了,无非就是给认识的类型套上了更华丽的衣服而已

常用的语言类型:

汇编
byte BYTE PBYTE
word WORD PWORD
dword DWORD PDWORD
C/C++
char CHAR PCHAR
unsigned char UCHAR PUCHAR
short SHORT PSHORT
unsigned short USHORT PUSHORT
int INT PINT
unsigned int UINT PUINT
bool BOOL

向上面的类型,都是从基本类型开始演化的,遇到不认识的就去查一查

好处是什么呢?

第一:全部统一成自己新定义的类型,可读性好

第二:利于跨平台和系统更新的代码修改

怎么合理使用win32 API的字符串

//字符
CHAR str[] = "吾爱破解";
WCHAR wstr[] = L"吾爱破解";

这里可以知道其实都是char类型,上面是ASCII码,下面是Unicode的编码形式

其实还有一种更加通用的方式

TCHAR tstr[] = TEXT("吾爱破解");

看看TCHAR

typedef WCHAR TCHAR

可以看到这是个WCHAR,其实这是个宏,看你当前编译器默认的编码格式是什么,编译的时候就会转成什么编码格式

有利程序跨平台

//字符指针
PSTR pstr = "吾爱破解";
PWSTR pwstr = L"吾爱破解";
PTSTR ptstr = TEXT("吾爱破解");

这个在VS2022中需要关闭个东西

char*的表达方式会造成程序崩溃,所以对其进行了控件管理。控件管理。

参考:“const char “ 类型的值不能用于初始化 “char “ 类型的实体的三种解决方法_const char " 类型的值不能用于初始化 "char " 类型的实体-CSDN博客

所以PSTR也就是char*,其他的也同理

然后回到MessageBox

#ifdef UNICODE
#define MessageBox  MessageBoxW
#else
#define MessageBox  MessageBoxA
#endif // !UNICODE

查看之后会发现其实没有MessageBox这个函数,只有MessageBoxA和MessageBoxW,所以MessageBox也只是跟TCHAR一样的方式而已,取决你的编译器而已

所以只要涉及到字符串的API,Windows都会设计两套方案,一套是ASCII码,一套是Unicode码

MessageBoxW的性能会更好,因为系统默认是宽字符,所以如果是ASCII码的话,到内核还要转成Unicode

传个真正的参数进去

//这是ASCII码的方式
CHAR a[] = "标题";
CHAR b[] = "欢迎来到吾爱大家庭";
MessageBoxA(0, b, a, 0);
return 0;

//这是Unicode码的方式
WCHAR a[] = L"标题";
WCHAR b[] = L"欢迎来到吾爱大家庭";
MessageBoxW(0, b, a, 0);

//这是通用的方式
TCHAR a[] = TEXT("标题");
TCHAR b[] = TEXT("欢迎来到吾爱大家庭");
MessageBox(0, b, a, 0);

还有一个参数是按钮类型,这里不多赘述


总结

  1. 所有类型都是从最基本的类型演化过来的,只是换了个名字
  2. 推荐使用通用的类型,方便跨平台

免费评分

参与人数 8吾爱币 +15 热心值 +7 收起 理由
asciibase64 + 1 谢谢@Thanks!
YZM23333 + 3 + 1 学习!!!
yp17792351859 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
ytfh1131 + 1 + 1 谢谢@Thanks!
wardwang + 1 + 1 热心回复!
willJ + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
1MajorTom1 + 1 我很赞同!
iTMZhang + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

eben 发表于 2024-4-17 07:41
滴水逆向??
以前只听说过windows api 还没有真正了解过
planet20230526 发表于 2024-5-7 17:13
10年前还是仔细研究了一下winapi的,只不过局限于粗略的了解框架、结构,没有深入学习和研究
zdw666 发表于 2024-4-17 11:47
evill 发表于 2024-4-17 13:01
滴水视频能分享一下么
 楼主| huchen 发表于 2024-4-17 14:28
evill 发表于 2024-4-17 13:01
滴水视频能分享一下么

论坛上有吧,你找找
FDL 发表于 2024-4-17 23:50
前几天还在帮别人解决win32的问题,学习一下
atoms 发表于 2024-4-23 22:06
好帖子 收藏了有空学习
609shen 发表于 2024-4-25 23:22
感谢关系正好用到
头像被屏蔽
hjsen 发表于 2024-4-26 20:03
提示: 作者被禁止或删除 内容自动屏蔽
nxcr 发表于 2024-5-4 18:19
科普教程文支持
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-14 06:43

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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