技术宅的结界

 找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 190|回复: 11
收起左侧

【Win32Asm】生成GUID的对话框

[复制链接]

12

主题

111

帖子

805

积分

用户组: 大·技术宅

UID
3808
精华
1
威望
16 点
宅币
611 个
贡献
46 次
宅之契约
0 份
在线时间
110 小时
注册时间
2018-5-6
发表于 2018-11-16 02:57:17 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有帐号?立即注册→加入我们

x
本帖最后由 watermelon 于 2018-11-16 02:59 编辑

不知道什么时候开始,好像是前两天,群里的QQ小冰29号大佬开始给自己的ID上了一串“乱七八糟”的字符串,随之系统消息(这里要指明是管理员那个系统消息)大佬也给自己的ID后面上了一串字符串。
当时我不明白这个是什么,感觉看起来很晦涩,好像密码一样,后来从他们吹水的过程中了解到这个原来是GUID。

GUID全称为Globally Unique Identifier,翻译为:全局唯一标识符。百度百科说:“全局唯一标识符(GUID,Globally Unique Identifier)是一种由算法生成的二进制长度为128位的数字标识符。GUID主要用于在拥有多个节点、多台计算机的网络或系统中。在理想情况下,任何计算机和计算机集群都不会生成两个相同的GUID。GUID 的总数达到了2^128(3.4×10^38)个,所以随机生成两个相同GUID的可能性非常小,但并不为0。所以,用于生成GUID的算法通常都加入了非随机的参数(如时间),以保证这种重复的情况不会发生。” “在 Windows 平台上,GUID 广泛应用于微软的产品中,用于标识如注册表项、类及接口标识、数据库、系统目录等对象。”   ----百度百科GUID

现在了解了,原来QQ小冰29号和系统消息大佬们给自己上的是全局唯一标识符,意思就是独一无二呗。
所以小弟就想写一个能生成GUID的对话框,一个目的是温习罗云彬大大给教的Win32Asm,另一个目的是我想弄出来。

我们从网上百度可以知道要弄GUID可以用API函数CoCreateGuid和GUID转化为字符串的函数StringFromGUID2,这个就常规invoke调用就行。但是我写好后发现结果不对,他是乱码啊,只出现几个汉字,这显然是错误的。后来百度发现原来还要进行字符集之间的转换,好吧。

这个程序的一大费力的事情就是自己对资源文件进行编写。什么坐标,长度,宽度都要考虑进去,为了对称美观小弟花了好长时间功夫(实际上UI的设计我还是没有长进)

下面小弟就放上程序,希望各位大佬多多批评指针。

资源文件:
[C] 纯文本查看 复制代码
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#include		<resource.h>
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define	ICO_MAIN		0x1000	//图标
#define	DLG_MAIN		1
#define	IDC_GUIDTEXT	101
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN	ICON		"Main.ico"
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
DLG_MAIN DIALOG 280, 180, 240, 100
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "watermelon GUID generator"
FONT 9, "宋体"
{
 CTEXT "Passion Coding, Yeah!!!", -1, 125, 80, 120, 20
 EDITTEXT IDC_GUIDTEXT, 40, 20, 160, 15
 DEFPUSHBUTTON "开始生成(&S)", IDOK, 95, 48, 50, 20
}
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>


源程序:
[Asm] 纯文本查看 复制代码
;本程序由watermelon进行编写,目的是生成GUID
		.386
		.model flat, stdcall
		option casemap :none
		
include		windows.inc
include		user32.inc
includelib	user32.lib
include		kernel32.inc
includelib	kernel32.lib
include		gdi32.inc
includelib	gdi32.lib
include		advapi32.inc
includelib	advapi32.lib
include		comctl32.inc
includelib 	comctl32.lib
include 	shell32.inc
includelib	shell32.lib
include 	ws2_32.inc
includelib	ws2_32.lib
include 	ole32.inc
includelib	ole32.lib


;等值定义
ICO_MAIN	equ		1000h	;图标
DLG_MAIN	equ		1
IDC_GUIDTEXT	equ		101


		.data
hInstance	dd		?


		.code
;对话框过程
_ProcDlgMain	proc	uses ebx edi esi hWnd,wMsg,wParam,lParam
		LOCAL	@szBuffer[128]:byte	;用于存放生成的GUID
		LOCAL	@guid:GUID		;定义一个GUID结构体
		LOCAL	@result[128]:byte	;用于存放最终的结果

		mov	eax,wMsg
		.if	eax == WM_CLOSE
			invoke	EndDialog,hWnd,NULL
		.elseif	eax == WM_INITDIALOG
			invoke	LoadIcon,hInstance,ICO_MAIN
			invoke	SendMessage,hWnd,WM_SETICON,ICON_BIG,eax
			invoke	GetDlgItem,hWnd,IDC_GUIDTEXT		;初始时候先灰化
			invoke	EnableWindow,eax,FALSE
		.elseif	eax == WM_COMMAND
			mov	eax,wParam
			.if	ax == IDOK
				;TODO :这里开始写生成GUID的程序,运用CoCreateGuid
				invoke	GetDlgItem,hWnd,IDC_GUIDTEXT
				invoke	EnableWindow,eax,TRUE		;将EDITTEXT激活
				
				;下面开始获取GUID和最终的结果
				invoke	CoCreateGuid,addr @guid
				;将GUID转化为字符串
				invoke	StringFromGUID2,addr @guid,addr @szBuffer,sizeof @szBuffer
				;字符集之间的转化,否则会出现显示不全或者乱码的情况
				.if	eax
					invoke	WideCharToMultiByte,CP_UTF8,0,\
						addr @szBuffer,-1,addr @result,\
						sizeof @result,NULL,NULL
					invoke	SetDlgItemText,hWnd,IDC_GUIDTEXT,addr @result
				.else
					invoke	SetDlgItemText,hWnd,IDC_GUIDTEXT,addr @szBuffer
				.endif
			.endif
		.else
			mov	eax,FALSE
			ret
		.endif
		mov	eax,TRUE
		ret

_ProcDlgMain	endp

start:
		invoke	GetModuleHandle,NULL
		mov	hInstance,eax
		invoke	DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlgMain,NULL	;模态对话框
		invoke	ExitProcess,NULL
end	start


附上运行时候的图片

EXE的图标来自歌曲:Alone   ---Wisp X/初音未来(QQ音乐),感谢深夜陪我一起passion coding

点击开始生成,编辑框中出现GUID

点击开始生成,编辑框中出现GUID

开始时候编辑框灰化

开始时候编辑框灰化

Passion.zip

29.31 KB, 下载次数: 5

评分

参与人数 1威望 +1 宅币 +8 贡献 +1 收起 理由
0xAA55 + 1 + 8 + 1 加油!

查看全部评分

菜鸟一枚,直接指正,不必留情

1010

主题

2246

帖子

5万

积分

用户组: 管理员

一只技术宅

UID
1
精华
200
威望
265 点
宅币
16897 个
贡献
33723 次
宅之契约
0 份
在线时间
1608 小时
注册时间
2014-1-26
发表于 2018-11-19 08:29:16 | 显示全部楼层
为了练手,我也用汇编写了一个自己的版本,用NASM写的。编译的时候需要nasm编译器,以及,随便找一个链接器就好。
不依赖任何lib(自己找出kernel32.dll的地址,然后从kernel32.dll里面找到LoadLibrary等各种函数,再加载需要的DLL使用)
整个程序只有2KB。

20181119092227.png

getguid.zip (589.62 KB, 下载次数: 1)

点评

内容深度: 5.0
内容深度: 5
厉害!!!  发表于 2018-11-19 11:58

1010

主题

2246

帖子

5万

积分

用户组: 管理员

一只技术宅

UID
1
精华
200
威望
265 点
宅币
16897 个
贡献
33723 次
宅之契约
0 份
在线时间
1608 小时
注册时间
2014-1-26
发表于 2018-11-16 07:00:15 | 显示全部楼层
你可以把“标识符”理解为“名字”,把“生成标识符”理解为“起名字”。

我造了个com类我应该叫它什么呢?起个GUID吧。有个用户注册了新账号我应该怎么代表这个用户呢?用GUID吧。我生产了一万台设备,它和服务器交互的时候,服务器怎么分出谁是谁呢?用GUID作为机器码吧。

12

主题

111

帖子

805

积分

用户组: 大·技术宅

UID
3808
精华
1
威望
16 点
宅币
611 个
贡献
46 次
宅之契约
0 份
在线时间
110 小时
注册时间
2018-5-6
 楼主| 发表于 2018-11-16 11:05:59 | 显示全部楼层
0xAA55 发表于 2018-11-16 07:00
你可以把“标识符”理解为“名字”,把“生成标识符”理解为“起名字”。

我造了个com类我应该叫它什么呢 ...

感谢站长鼓励和指导,小弟我get到啦
菜鸟一枚,直接指正,不必留情

28

主题

70

帖子

2335

积分

用户组: 管理员

UID
1043
精华
12
威望
72 点
宅币
1890 个
贡献
171 次
宅之契约
0 份
在线时间
301 小时
注册时间
2015-8-15
发表于 2018-11-18 11:34:58 | 显示全部楼层
挺想说的是,Visual Studio一直是自带GUID生成器的,而且还可以辅助格式化。
Capture.JPG
Capture.JPG
flowers for Broken spirits - a woman turned into stake will hold the world in the basin of fire.

12

主题

111

帖子

805

积分

用户组: 大·技术宅

UID
3808
精华
1
威望
16 点
宅币
611 个
贡献
46 次
宅之契约
0 份
在线时间
110 小时
注册时间
2018-5-6
 楼主| 发表于 2018-11-18 18:34:48 | 显示全部楼层
tangptr@126.com 发表于 2018-11-18 11:34
挺想说的是,Visual Studio一直是自带GUID生成器的,而且还可以辅助格式化。

...

啊,果然是啊,谢谢tangptr大佬指导
1.jpg
2.jpg
菜鸟一枚,直接指正,不必留情

12

主题

111

帖子

805

积分

用户组: 大·技术宅

UID
3808
精华
1
威望
16 点
宅币
611 个
贡献
46 次
宅之契约
0 份
在线时间
110 小时
注册时间
2018-5-6
 楼主| 发表于 2018-11-19 12:07:08 | 显示全部楼层
0xAA55 发表于 2018-11-19 08:29
为了练手,我也用汇编写了一个自己的版本,用NASM写的。编译的时候需要nasm编译器,以及,随便找一个链接器 ...

站长好贴心把build.bat和nasm.exe都给了出来,移到当前目录双击bat就出来了EXE真的方便。
NASM写的程序很规矩,小弟我看了好像是站长没有写资源文件,把控件的一些特性(例如资源ID直接写成了数值)。还有就是站长一开始强调的不依赖任何lib,自己找出kernel32.dll的地址,然后只加载这个程序所需要的dll和各种导出函数来使用,我刚刚自己又把我的程序去掉图片编译了一下,发现我的大小是3.00KB(3,072字节),而站长的是2.00KB(2,048字节)。看来是站长的手动找kernel32.dll地址然后后面自己找函数起了作用。orz
菜鸟一枚,直接指正,不必留情

12

主题

111

帖子

805

积分

用户组: 大·技术宅

UID
3808
精华
1
威望
16 点
宅币
611 个
贡献
46 次
宅之契约
0 份
在线时间
110 小时
注册时间
2018-5-6
 楼主| 发表于 2018-11-19 12:10:30 | 显示全部楼层
0xAA55 发表于 2018-11-19 08:29
为了练手,我也用汇编写了一个自己的版本,用NASM写的。编译的时候需要nasm编译器,以及,随便找一个链接器 ...

小弟我还得再仔细研读一下程序,看看这个手动找到kernel32.dll和里面函数的
菜鸟一枚,直接指正,不必留情

1010

主题

2246

帖子

5万

积分

用户组: 管理员

一只技术宅

UID
1
精华
200
威望
265 点
宅币
16897 个
贡献
33723 次
宅之契约
0 份
在线时间
1608 小时
注册时间
2014-1-26
发表于 2018-11-19 12:15:09 | 显示全部楼层
watermelon 发表于 2018-11-19 12:07
站长好贴心把build.bat和nasm.exe都给了出来,移到当前目录双击bat就出来了EXE真的方便。
NASM写的程序很 ...

其实不是……而是我把.rdata段的内容合并到.text段了(虽然这样做并不好)少了一个段,就少了一个必须要对齐的东西,从而压缩了体积。

另外你对WideCharToMultiByte的调用让我看了觉得累得慌……如果是我,我就直接使用W系API了

12

主题

111

帖子

805

积分

用户组: 大·技术宅

UID
3808
精华
1
威望
16 点
宅币
611 个
贡献
46 次
宅之契约
0 份
在线时间
110 小时
注册时间
2018-5-6
 楼主| 发表于 2018-11-19 16:06:30 | 显示全部楼层
0xAA55 发表于 2018-11-19 12:15
其实不是……而是我把.rdata段的内容合并到.text段了(虽然这样做并不好)少了一个段,就少了一个必须要 ...

:-O,有道理
菜鸟一枚,直接指正,不必留情

1

主题

17

帖子

44

积分

用户组: 初·技术宅

UID
4492
精华
0
威望
2 点
宅币
23 个
贡献
0 次
宅之契约
0 份
在线时间
0 小时
注册时间
2018-11-20
发表于 2018-11-20 18:06:36 | 显示全部楼层
没钱好痛苦啊啊啊啊

评分

参与人数 1宅币 -5 收起 理由
0xAA55 -5 无关回帖惩罚

查看全部评分

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|技术宅的结界 ( 滇ICP备16008837号|网站地图

GMT+8, 2018-12-15 10:27 , Processed in 0.121562 second(s), 44 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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