扰乱·蓝 发表于 2016-7-14 17:45:06

VC++新手自学日志【求同好】

本帖最后由 扰乱·蓝 于 2016-7-14 20:27 编辑

本人在学校学了半年C语言,以后就没有课了,感觉就这么半途而废挺可惜的,所以暑假来自学C++,项目就是一个酷Q插件!欢迎新手来交流,欢迎大神来指点。
我的开发平台:
Windows10 Insider Preview 14388 企业版 x64(发帖时候是这个,以后微软还会发更新就不管了)
VS Community 2015 VC++
CoolQ Pro 5.5
Microsoft Office Access 2016 x64 Insider Preview(以后连数据库用)
提醒:本帖虽然有一些详细教程,但是并不能代替酷Q文库,文库里有的内容我都会省略或者链接过去,如果你发现我把文库里的内容重复说了一遍欢迎指出。
由于原来的二楼被吞了,现在的二楼应该是三楼,二楼在后面补上了,请注意阅读顺序,否则会莫名其妙

扰乱·蓝 发表于 2016-7-14 17:57:25

RE: VC++新手自学日志【求同好】

这贴不仅是日志,还会有详细的新手教程,直接看帖就行,不用下载的。
第一步先下SDK:https://codeload.github.com/CoolQ/cqsdk-vc/zip/master
这个SDK就是给你提供了些代码的基本格式规范以及一些示例说明,但是非常简略,很多关键信息都没说,导致我吃了不少亏……
下载以后,请先把你下载的文件复制一份,源文件保留。这很重要!新手第一次写不知道会犯什么错误,一旦什么地方弄错了要留一份恢复的副本。
如果你正确安装了VS 2015,那么应该可以直接打开CQPdemo.sln,这个文件链接了整个项目里所有的必需文件,不用你再手动添加了。这个项目大概使用老版本VS做的,新版VS打开以后会提示需要更新项目文件,你要允许它更新,这个跟Word 2016打开.doc文件会提示要更新文件是一个道理。更新完了以后你的项目文件夹下会如图所示:

扰乱·蓝 发表于 2016-7-14 18:17:12

RE: VC++新手自学日志【求同好】

本帖最后由 扰乱·蓝 于 2016-7-14 18:21 编辑


先来观察一下右侧的“解决方案资源管理器”
你需要提交给酷Q程序的应该是一个DLL和一个JSON(放在酷Q Pro\App下),这两个文件应该具有相同的文件名(除了扩展名),去除扩展名之后的这部分名字,称为AppID。在资源管理器里,第一行的com.example.democ就是你将要制作的DLL文件名(扩展名已省略),下面的com.example.democ.json就是你需要提交的JSON。这两个文件名必须保持一致。
你的插件有两个名字,一个是显示名,另一个是AppID,这两个名字都可以自己起,但是有不同的要求:
显示名必须是ANSI字符,不支持Unicode;
AppID的规则更复杂,参考http://d.cqp.me/Pro/%E5%BC%80%E5%8F%91/%E5%9F%BA%E7%A1%80%E4%BF%A1%E6%81%AF
先按规则起好你的两个名字,然后在相对应的位置修改

扰乱·蓝 发表于 2016-7-14 18:19:10

RE: VC++新手自学日志【求同好】

扰乱·蓝 发表于 2016-7-14 18:17
先来观察一下右侧的“解决方案资源管理器”
你需要提交给酷Q程序的应该是一个DLL和一个JSON(放在酷Q Pro\ ...

这个应该是三楼,二楼吞了……

扰乱·蓝 发表于 2016-7-14 18:33:03

RE: VC++新手自学日志【求同好】

补二楼:
先下载SDK:VC++SDK
SDK是一个模板,可以让你省去复杂的格式要求,直接按照模板提供的格式编写自己的内容。
解压后,用VS2015可以打开CQPdemo.sln,这个文件链接了整个项目里所有的必需文件,不用你自己再手动添加了。这个SDK貌似是老版软件做的,新版软件打开会提示需要更新文件,就让它更新好了,不影响使用。

扰乱·蓝 发表于 2016-7-14 18:34:47

RE: VC++新手自学日志【求同好】


你可以看到DLL和JSON文件名给我改成了00.0.0,这是一个合法的AppID,可以通过酷Q检查,但是没有什么实际意义,你自己写的时候最好写个有意义的。

扰乱·蓝 发表于 2016-7-14 18:37:43

RE: VC++新手自学日志【求同好】


这样还没有结束,你还需要打开appmain.h,将这里面的CQAPPID也定义为你之前的文件名AppID。

天天向上的我 发表于 2016-7-14 18:53:42

感谢您为酷Q做出的贡献。

扰乱·蓝 发表于 2016-7-14 19:05:09

RE: VC++新手自学日志【求同好】


下面修改JSON文件。请注意这个文件中只能使用ANSI字符,如果你使用了Unicode,VS会提示你转换文件格式。注意!千万不要真的转换了,酷Q无法识别Unicode格式的JSON。
在修改之前,你要明确JSON的作用:这个文件是你的DLL和酷Q之间的交流协议,它规定了酷Q该如何使用你写的DLL。
这个是被我修改后的JSON,你会发现和你SDK的原版JSON相比有许多不同。你应该先阅读文库http://d.cqp.me/Pro/%E5%BC%80%E5%8F%91中的“应用信息”这一节,然后再来看我的图,你可以比较一下,凡是被我修改的地方,都是可以修改为自定义内容的(我说的可以指的是酷Q程序不会报错,不代表合乎其它规范,其它规范请自己阅读文库)
SDK提供了一些事件的模板样例,文库中也有相关说明。我只补充一些文库中没提到的重要信息。
event部分:
id:这就是个索引,只要保证你所有事件的id不重复即可
type:规定酷Q应该在何时触发这个事件。每种事件对应的type值是固定的,只要你设置的type值正确,酷Q就会在正确的时机触发你的事件。事件的名称无关紧要。
name:这个就是显示给用户看的,和你的程序没有关系。
function:自由定义,但不能重复,而且有格式要求:
1、由英文字母、数字、下划线构成
2、第一个字符不能是数字
3、大小写敏感,大写和小写是不同的
4、不能和这些关键字重名:https://msdn.microsoft.com/zh-cn/library/2e6a4at9.aspx
如果你需要删除一个事件,需要把一对{}内的内容以及之后的逗号完全删除,否则会报错。请注意不要删除[],而且[]内的最后一对{}后不能跟逗号,其它的必须跟逗号。
如果你需要增加新的事件,建议复制粘贴再修改,以免疏忽。

扰乱·蓝 发表于 2016-7-14 19:24:48

RE: VC++新手自学日志【求同好】


event是酷Q从QQ服务器获取的事件传送给插件,而menu则是允许用户手动触发的事件,其它的和event一样,按模板写就行了。
auth部分,你需要按照注释,列出你的插件的行为。如果你的插件不需要执行某些行为,删除那一项权限,减少资源占用。

扰乱·蓝 发表于 2016-7-14 19:58:29

RE: VC++新手自学日志【求同好】

你自己的代码主要写在appmain.cpp中,或者你可以自己新建源码文件和头文件,其它的文件不要修改,除非你非常清楚那些代码的意义。
appmain.cpp中,开头的这部分内容请勿修改:

无论是你的代码还是编译预处理,都请写在这些代码的后面,不要修改它们。
下面还有一些事件处理函数,具有这样的格式:
CQEVENT(int32_t, [函数名], [大小])([参数列表])
{
[代码]
return [返回值];
}
请保证列出的所有事件处理函数的[函数名]和你在JSON中event和menu部分设置的function值一一对应。每一个function值都应该有一个事件处理函数具有同样的[函数名],不要重复也不要遗漏。当然你仍然可以写自己的子函数。
[大小]和JSON中对应function的type对应。即JSON中规定的type决定了对应的事件处理函数的[大小]。对应关系:
type-大小
2-36
4-32
21-24
101-24
102-32
103-32
201-16
301-24
302-32
其它type对应0,menu中function对应的事件处理函数[大小]均为0。
[参数列表]是一系列对该类事件的详细描述,你可以在代码中作为变量使用。每个变量所描述的信息在注释中有,或者该变量名本身就指出了它所描述的信息。
[返回值]对于event函数,除非你在JSON中有多个event项目设置了相同的type,否则[返回值]应设为1;如果有type相同的event项,可以设为0,表示允许该事件继续交给其它函数处理。对于menu函数,[返回值]一律设为0。

扰乱·蓝 发表于 2016-7-14 20:13:38

RE: VC++新手自学日志【求同好】

继续之前先阐述一下酷Q的工作原理:
先是QQ服务器端发送数据给酷Q客户端,酷Q根据数据判断是否触发了事件,以及触发了哪类事件,不同类事件都有一个默认的type,然后酷Q会根据这个type在JSON中查找所有具有该type的event项目,并将这些项目按照priority从小到大的顺序排列,然后按照顺序依次向你的DLL发送指令,指令的内容就是每个event项目所规定的function值,以及该事件的type所决定的必要参数。在你的DLL内部,会先查找指令中指定的function,找到[函数名]正确的函数,然后按[参数列表]规定的顺序代入参数,执行你写的代码。[参数列表]只规定了参数的数目、顺序和类型,而参数变量名称酷Q是不管的,也就是说只要数目顺序类型正确,参数变量的名称你可以自己修改。比如fromQQ你可以把它改成TheQNumberItFrom,或者abc,都可以,只要你自己方便就行。
最后,如何命令酷Q执行你需要的动作呢?你需要调用头文件cqp.h中声明的函数。这些函数只进行了声明,其定义在酷Q加载后会在其它DLL中定义,所以VS可能会提示这些函数未定义,但不影响编译生成,请忽视这些提示。

cqp.h分为常量定义和函数声明两部分。常量定义部分看不懂也没关系,关键是后面的函数声明部分。

扰乱·蓝 发表于 2016-7-14 20:24:43

RE: VC++新手自学日志【求同好】


每一条声明都具有如下格式:
CQAPI([返回值类型]) [函数名]([参数列表]);
[函数名]描述了该函数的功能,如果你看不懂英文(笑),JSON中的auth部分的注释有每一个函数英文名的翻译。
CQ_get开头的函数用于向QQ服务器获取一些状态信息(比如获取某个群员的信息),其它函数用于向服务器发送操作指令(比如发送消息)。get类函数返回你想要获取的信息,其它函数返回操作结果。不同的返回值对应的操作结果,在cqp.h的常量定义部分有说明。
你必须按照[参数列表]的规定调用这些函数。
至此你已经可以通过C++代码实现酷Q支持的所有功能。接下来就是C++的问题了……注意我在一楼强调我是C++新手,而不是酷Q新手……所以以后讲的主要都是C++的问题……

IMEKB 发表于 2016-7-15 03:56:30

码了这么多字,辛苦了,
就是现在不看,也会先收藏

扰乱·蓝 发表于 2016-7-15 08:41:57

RE: VC++新手自学日志【求同好】

下面主要讨论数据库。
酷Q插件大多都具有这些功能:
决定回复哪些群的消息,哪些不回复;
储存群员的信息,需要时随时调出。
这些都需要你的插件读写文件,因为这些需要长期保存的信息是不可能让它一直待在内存里的。如果你的数据量不大,可以直接读写文本文件或者二进制文件,用fopen_s函数(C语言的fopen函数被VS禁用了,虽然可以解禁但是很麻烦)。但我这里主要想探出一条操作较大数据量的常见办法——数据库。
数据库可以在本地建立数据库文件,也可以在网络上寻找一个数据库提供商比如(Microsoft Azure),在网络服务器上建立数据库。但是网络数据延迟比较长,如无必要建议使用本地数据库文件。
先用Access做了一个数据库,功能很简单,就是储存一些群号,只有来自这些群号的消息才会被回复。

数据库只要设计一下就行了,就是群号一栏,是否开启一栏。最难的是将你的插件连接到数据库。
页: [1] 2 3
查看完整版本: VC++新手自学日志【求同好】