Giter VIP home page Giter VIP logo

wxbox's Introduction

WxBox

主要功能

  • WeChat进程实例多开;
  • 消息防撤回;
  • 监控账户生命周期【登录、注销、退出PC客户端】;
  • 检查PC微信是否处于登录状态;
  • Plugin触发PC端退出登录;
  • 获取登录账户的Profile;
  • 获取包括群聊在内的所有联系人信息【只获取昵称、备注、wxnumber和wxid】;
  • 昵称、wxnumber和wxid之间的相互转换;
  • 接管WeChat原始消息和处理过的消息;
  • 接管WeChat发送文本消息;
  • Plugin主动执行发送文本消息、文件、图片,对于群聊可以指定@列表。可以指定发送的目标和内容;
  • 过滤接收到的消息【原始消息拦截事件中】;
  • 替换接收到的消息【原始消息拦截事件中】,可以替换发送者、消息内容,对于群聊可以替换talker;
  • 通过WxBox或者手机端WeChat的“文件传输助手”向PC WeChat客户端发出执行Plugin命令的指令;
  • 自定义纯文本和二进制类型的Plugin。

Plugin预定义wxbox模块提供的部分API接口

WxBox的核心功能在Plugin上,上面的所有功能都可以在自定义的Plugin中调用,而Plugin可以通过WxBox和filehelper来调用。

​ WxBot里面预定义了一个wxbox模块,它提供了一些API接口,这些API包含了上面还有之外的功能,完整的wxbox模块API可以看plugins目录下的wxbox_apis.txt文件,下面列出部分:

  • >>wxbox.version查看wxbox的版本
  • >>wxbox.help查看wxbox命令帮助,它会给文件传输助手发送一个wxbox_apis.txt文件
  • >>wxbox.get_phone_test_case如果处于登录状态的话,会给手机上的文件传输助手发送所有手机的测试用例
  • >>wxbox.snap向filehelper发送一个桌面系统所有显示器拼接的“载图”
  • >>wxbox.snap_main_monitor向filehelper发送一个桌面主Monitor的“载图”
  • >>wxbox.info、>>wxbox.warning、>>wxbox.error向WxBox发送不同Level的日志
  • >>wxbox.shell在PC系统上执行有权限执行的所有类型的shell命令【*】,可以通过它执行关机、打开程序、图片等指令
  • >>wxbox.msgbox给PC弹出一个对话框,用来提示消息的
  • >>wxbox.speak让PC播放一段指定文本的语音
  • >>wxbox.lock_screen让PC锁屏
  • >>wxbox.list_drivers列出PC系统上所有的硬盘驱动器盘符
  • >>wxbox.list_files列出PC系统上指定文件夹目录下的所有文件和文件夹
  • >>wxbox.download把PC上指定的文件通过filehelper传输到手机上,大小限制跟WeChat发送文件大小的限制一样,听说最大是1GB,但是没测试过
  • >>wxbox.uninject_wxbot卸载PC上当前用户的WxBot模块
  • >>wxbox.exit_wxbox关闭PC上的WxBox
  • >>wxbox.logout让PC上的WeChat退出登录
  • >>wxbox.nickname_to_wxid昵称转为wxid
  • >>wxbox.wxid_to_wxnumber从wxid转为wxnumber
  • >>wxbox.chatroom_wxid获取群聊的roomWxid
  • >>wxbox.send_text_to_filehelper向filehelper发送文本消息
  • >>wxbox.send_picture_to_filehelper向filehelper发送图片
  • >>wxbox.send_file_to_filehelper向filehelper发送文件
  • >>wxbox.send_text向指定wxid联系人发送文本消息
  • >>wxbox.send_picture向指定wxid联系人发送图片
  • >>wxbox.send_file向指定wxid联系人发送文件
  • >>wxbox.send_text_with_wxnumber向指定wxnumber联系人发送文本消息
  • >>wxbox.send_picture_with_wxnumber向指定wxnumber联系人发送图片
  • >>wxbox.send_file_with_wxnumber向指定wxnumber联系人发送文件
  • >>wxbox.send_text_to_chatroom向指定群聊发送文本消息,消息后面可选带@列表
  • >>wxbox.send_picture_to_chatroom向群聊发送图片
  • >>wxbox.send_file_to_chatroom向群聊发送文件
  • >>wxbox.chatroom_notiry在群聊上@一部分人
  • >>wxbox.chatroom_notiry_all在群聊上@所有人

第三方依赖

​ 注意:以下部分库存在编译好的版本或者我们自己编译过的Windows版本放在这个仓库上:https://gitee.com/phantom27/wxbox-public-storage

  • gRPC - v1.41.1
  • protobuf - v3.17.3
  • frida-gum(弃用)
  • TitanEngine(弃用)
  • Qt5
  • spdlog - v1.9.2
  • meson+ninja - >=v0.60.2
  • cmake
  • pkg-config
  • lua - v5.4.3
  • googletest - v1.11.0
  • yaml-cpp - v0.7.0

i18n支持

​ 项目中以简体中文为原始语言,如果加入新的文本还有翻译,需要手动更新assets/translations/下的zh_cn.ts和en.ts,可以配合Linguist做调整,然后执行以下命令,生成对应的qm文件,并touch wxbox.qrc使编译器知道资源文件更新了(如果执行githooks/setup_hook可以安装一个git的pre-commit钩子,在commit前会自动检查更新)

# Windows
.\scripts\update_i18n.bat

# Mac OS
./scripts/update_i18n

​ 另外由于采用的原始语言是英文,而在一些编辑器上,特别是中文环境的Visual Studio IDE上,默认的编码可能用的是gbk,直接使用中文文本这就有可能导致跟ts文件的对不上,所以在非.ui文件上,也就是在.cpp或者.h上的文本尽量使用英文,然后在zh_cn.ts上转成中文,zh_cn.ts和en.ts用的都是utf8。

​ 或者用转义的方式(utf8一般一个汉字三个字节)也可以,例如:

QMessageBox::information(this, tr("Title"), tr("\345\205\263\344\272\216 WxBox"));

构建方法

​ 首先需要安装meson+ninja构建工具,可以到以下路径下载:https://github.com/mesonbuild/meson/releases。

  • ​ spdbuf需要cmake构建工具。
  • ​ 编译器需要C++17以上标准。
  • ​ 构建路径必须包含在build里面(不管是debug还是release版本的),ninja为backend使用build/debug和build/release,vs为backend使用build/vsdebug和build/release,mac用xcode构建的话使用build/xcodedebug和build/xcoderelease

关于构建时出现的Warning

​ 在编译时,部分第三方库有非常多的Warning,这些全部忽略它,但是不关闭这些警告。但是主项目构建时出现的所有Warning都要重新检查,对主项目的所有Warning零容忍

Qt SDK环境路径

​ 在Windows中要把qmake的路径加入Path中,否则meson识别不到Qt5

# 下面是一个msvc2017构建kit路径的例子,注意必须是32位的版本
F:\Qt\Qt5.14.2\5.14.2\msvc2017\bin

​ Qt SDK下载路径:https://download.qt.io/archive/qt/,官方镜像列表:https://download.qt.io/static/mirrorlist/,尽量使用Qt 5.11~ Qt 5.15版本的SDK。

Qt依赖处理

​ 在Windows下使用windeployqt,Mac OS下使用macdeployqt,这两个都是Qt官方的工具。

lua wrap补丁

​ meson官方的lua wrap生成的是动态库,但是我们需要的是静态库,所以对meson官方的lua_5.4.3-1 wrap打了个补丁,修改为生成静态库。这个直接以zip包方式放在仓库上,wrap下回来的包使用的是这个。

# 打补丁的位置是lua-5.4.3/meson.build
# 补丁内容如下:
index a9c4d56..2004cfb 100644
--- a/meson_original.build
+++ b/meson.build
@@ -49,7 +49,7 @@ if get_option('line_editing')
 endif

 # Targets.
-lua_lib = library('lua',
+lua_lib = static_library('lua',
   'src/lapi.c',
   'src/lauxlib.c',
   'src/lbaselib.c',
@@ -83,8 +83,6 @@ lua_lib = library('lua',
   'src/lvm.c',
   'src/lzio.c',
   dependencies: lua_lib_deps,
-  version: meson.project_version(),
-  soversion: lua_versions[0] + '.' + lua_versions[1],

构建依赖

​ 由于只有gRPC构建出来比较麻烦,所以这里只记录gRPC的构建方法。另外在编译gRPC的时候protobuf也一起编译了,所以不需要另外编译protobuf了。

gRPC构建方法

​ 如果在Mac OS环境下能用brew安装gRPC的dev包,那么就不需要,对于Windows已经编译好了一份Debug和一份Release版本的了,它们将放在仓库上,并且已经给gRPC写了一个meson的wrap,在使用meson构建时将会自动下载。(note:这个也可以用vcpkg来构建,不过版本相对有点旧,所以不用vcpkg的port)

# 克隆gRPC
git clone --recurse-submodules -b v1.43.0 https://github.com/grpc/grpc

# 如果克隆下来后因为网络原因导致一些submodules未下回来,可以先把grpc克隆回来,然后后面再用下面的命令来把submodule拉回来
git submodule init
git submodule update

# 对于Windows 需要下载依赖
sudo choco install nasm

# 对于Mac OS 需要下载以下依赖
brew install autoconf automake libtool pkg-config

# 另外注意,这是用cmake来构建configure的所以cmake在两个平台下都需要

# Windows环境下编译gRPC Debug版本(先切到gRPC仓库的根目录后执行下面命令)
mkdir -p cmake/build/debug & cd cmake/build/debug
cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Debug -DgRPC_BUILD_TESTS=OFF -DgRPC_INSTALL=ON -DgRPC_BUILD_GRPC_CSHARP_PLUGIN=OFF -DgRPC_BUILD_GRPC_NODE_PLUGIN=OFF -DgRPC_BUILD_GRPC_OBJECTIVE_C_PLUGIN=OFF -DgRPC_BUILD_GRPC_PHP_PLUGIN=OFF -DgRPC_BUILD_GRPC_PYTHON_PLUGIN=OFF -DgRPC_BUILD_GRPC_RUBY_PLUGIN=OFF -DgRPC_BUILD_CSHARP_EXT=OFF -DCMAKE_INSTALL_PREFIX=../../install/debug ../..
nmake
nmake install

# Windows环境下编译gRPC Release版本(先切到gRPC仓库的根目录后执行下面命令)
mkdir -p cmake/build/debug & cd cmake/build/debug
cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DgRPC_BUILD_TESTS=OFF -DgRPC_INSTALL=ON -DgRPC_BUILD_GRPC_CSHARP_PLUGIN=OFF -DgRPC_BUILD_GRPC_NODE_PLUGIN=OFF -DgRPC_BUILD_GRPC_OBJECTIVE_C_PLUGIN=OFF -DgRPC_BUILD_GRPC_PHP_PLUGIN=OFF -DgRPC_BUILD_GRPC_PYTHON_PLUGIN=OFF -DgRPC_BUILD_GRPC_RUBY_PLUGIN=OFF -DgRPC_BUILD_CSHARP_EXT=OFF -DCMAKE_INSTALL_PREFIX=../../install/release ../..
nmake
nmake install

# Mac OS环境下编译gRPC Debug版本(先切到gRPC仓库的根目录后执行下面命令)
mkdir -p cmake/build/debug & cd cmake/build/debug
cmake -G -DCMAKE_BUILD_TYPE=Debug -DgRPC_BUILD_TESTS=OFF -DgRPC_INSTALL=ON -DgRPC_BUILD_GRPC_CSHARP_PLUGIN=OFF -DgRPC_BUILD_GRPC_NODE_PLUGIN=OFF -DgRPC_BUILD_GRPC_OBJECTIVE_C_PLUGIN=OFF -DgRPC_BUILD_GRPC_PHP_PLUGIN=OFF -DgRPC_BUILD_GRPC_PYTHON_PLUGIN=OFF -DgRPC_BUILD_GRPC_RUBY_PLUGIN=OFF -DgRPC_BUILD_CSHARP_EXT=OFF -DCMAKE_INSTALL_PREFIX=../../install/debug ../..
make -j
make install

# Mac OS环境下编译gRPC Release版本(先切到gRPC仓库的根目录后执行下面命令)
mkdir -p cmake/build/debug & cd cmake/build/debug
cmake -DCMAKE_BUILD_TYPE=Release -DgRPC_BUILD_TESTS=OFF -DgRPC_INSTALL=ON -DgRPC_BUILD_GRPC_CSHARP_PLUGIN=OFF -DgRPC_BUILD_GRPC_NODE_PLUGIN=OFF -DgRPC_BUILD_GRPC_OBJECTIVE_C_PLUGIN=OFF -DgRPC_BUILD_GRPC_PHP_PLUGIN=OFF -DgRPC_BUILD_GRPC_PYTHON_PLUGIN=OFF -DgRPC_BUILD_GRPC_RUBY_PLUGIN=OFF -DgRPC_BUILD_CSHARP_EXT=OFF -DCMAKE_INSTALL_PREFIX=../../install/release ../..
make
make install
gRPC引用注意

​ gRPC在install后是会打包好给pkg-config用的pc文件的,但是由于生成的lib文件非常的多,执行一次pkg-config搜索非常的慢,所以项目中用的方法是,调用一次pkg-config然后把参数记录下来,直接写进meson的wrap中。

# 下面是在Windows环境下执行的pkg-config,PKG_CONFIG_PATH需要根据实际情况修改
PKG_CONFIG_PATH=/g/Tutorial/meson/testgrpc/grpc/lib/pkgconfig ./pkg-config.exe grpc++ --cflags --libs

# 结果如下:
/W3 /DNOMINMAX /DWIN32_LEAN_AND_MEAN /D_CRT_SECURE_NO_WARNINGS /D_SCL_SECURE_NO_WARNINGS /D_ENABLE_EXTENDED_ALIGNED_STORAGE /bigobj /wd4005 /wd4068 /wd4180 /wd4244 /wd4267 /wd4503 /wd4800 -IG:/Tutorial/meson/testgrpc/grpc/include  -ignore:4221 -LG:/Tutorial/meson/testgrpc/grpc/lib -lgrpc++ -lgrpc -laddress_sorting -lre2 -lupb -lcares -lz -lgpr -labsl_statusor -lssl -lcrypto -labsl_hash -labsl_raw_hash_set -labsl_hashtablez_sampler -labsl_city -labsl_low_level_hash -labsl_random_distributions -labsl_random_seed_sequences -labsl_random_internal_pool_urbg -labsl_random_internal_randen -labsl_random_seed_gen_exception -labsl_random_internal_randen_hwaes -labsl_random_internal_randen_slow -labsl_random_internal_randen_hwaes_impl -labsl_random_internal_platform -labsl_random_internal_seed_material -labsl_status -labsl_cord -labsl_cordz_info -labsl_cord_internal -labsl_cordz_functions -labsl_cordz_handle -labsl_exponential_biased -labsl_synchronization -labsl_bad_optional_access -labsl_str_format_internal -labsl_graphcycles_internal -labsl_stacktrace -labsl_symbolize -labsl_time -labsl_debugging_internal -labsl_demangle_internal -labsl_malloc_internal -labsl_civil_time -labsl_strings -labsl_time_zone -labsl_strings_internal -labsl_int128 -labsl_throw_delegate -labsl_base -labsl_spinlock_wait -labsl_bad_variant_access -labsl_raw_logging_internal -labsl_log_severity

# 处理过之后编译参数整理为:
['/DNOMINMAX', '/DWIN32_LEAN_AND_MEAN', '/D_CRT_SECURE_NO_WARNINGS', '/D_SCL_SECURE_NO_WARNINGS', '/D_ENABLE_EXTENDED_ALIGNED_STORAGE', '/bigobj', '/wd4005', '/wd4068', '/wd4180', '/wd4244', '/wd4267', '/wd4503', '/wd4800']

# 依赖的静态库文件整理如下(这里还实际调试把漏掉的补上了):
['grpc++', 'grpc', 'address_sorting', 're2', 'upb', 'cares', 'zlib', 'gpr', 'absl_statusor', 'ssl', 'crypto', 'absl_hash', 'absl_raw_hash_set', 'absl_hashtablez_sampler', 'absl_city', 'absl_low_level_hash', 'absl_random_distributions', 'absl_random_seed_sequences', 'absl_random_internal_pool_urbg', 'absl_random_internal_randen', 'absl_random_seed_gen_exception', 'absl_random_internal_randen_hwaes', 'absl_random_internal_randen_slow', 'absl_random_internal_randen_hwaes_impl', 'absl_random_internal_platform', 'absl_random_internal_seed_material', 'absl_status', 'absl_cord', 'absl_cordz_info', 'absl_cord_internal', 'absl_cordz_functions', 'absl_cordz_handle', 'absl_exponential_biased', 'absl_synchronization', 'absl_bad_optional_access', 'absl_str_format_internal', 'absl_graphcycles_internal', 'absl_stacktrace', 'absl_symbolize', 'absl_time', 'absl_debugging_internal', 'absl_demangle_internal', 'absl_malloc_internal', 'absl_civil_time', 'absl_strings', 'absl_time_zone', 'absl_strings_internal', 'absl_int128', 'absl_throw_delegate', 'absl_base', 'absl_spinlock_wait', 'absl_bad_variant_access', 'absl_raw_logging_internal', 'absl_log_severity', 'libprotobuf', 'grpc++_reflection']

更换为v1.41.1版本

​ 由于v1.44.0版本使用时出现崩溃,所以换成了较老的1.41.1版本的gRPC.

Windows下构建

# 在Visual Studio “x86”开发人员命令提示符执行以下命令
# 默认用的backend是ninja
# !!! 构建路径必须包含在build里面 !!!
meson setup build/release --buildtype release
meson compile -C build/release

Mac OS下构建

​ ......

关于测试

​ 测试使用的框架是googletest,详细文档可以看:https://google.github.io/googletest/

# 执行测试(以debug版本为例子)
meson compile -C build/debug
meson test -C build/debug

​ 另外测试时要留意是否出现内存泄漏,对内存泄漏零容忍,必须避免。

禁用测试用例

​ 可以通过宏开关来禁用某些测试用例,例如:禁用wxbox_utils的测试用例,可以用下面的方法reconfigure:

meson build/vsdebug --reconfigure -Ddisable_wxbox_utils_test=true

​ 更多的开关可以看meson_options.txt

开发时的调试方法

​ 开发调试不使用ninja作为backend,也不使用vscode作为编辑器,而是切为IDE,在Windows下用Visual Studio,在Mac OS下用xcode。另外下面Windows版本中,Visual Studio指定了wxbox为启动项目,在使用Visual Studio写测试用例时可以改为测试用例为启动项目。

安装git钩子

# 安装git pre-commit钩子,用于提交前自动完成代码风格化和更新i18n文件
./githooks/setup_hook

Windows下使用Visual Studio IDE来开发并调试

# 以Visual Studio为backend创建工程
meson setup build/vsdebug --buildtype debug --backend vs -Dbackend_startup_project=wxbox

# 构建vs工程完成后,就可以打开build/vsdebug/WxBox.sln工程,然后把“wxbox@exe”修改为启动项目,接着就可以开发调试了

# 另外在IDE环境开发时,如果加入某些新源文件、修改的项目的配置,可以用以下命令reconfigure
meson build/vsdebug --reconfigure

Mac OS下使用xcode IDE来开发并调试

# 以xcode为backend创建工程
meson setup build/xcodedebug --buildtype debug --backend xcode

关于调试开发时一些dll、so查找路径的问题

​ 如果是执行meson test进行测试话,在meson.build中已经配置好了PATH,但是如果像在Visual Studio中,调试开发运行时,dll、so的查找路径并没有通过meson.build中指定(meson目前应该是不支持的),通过脚本拷贝dll去工作目录的话没啥必要,所以就手动在Visual Studio中配置PATH吧。

image

​ 这里的例子是包含wintools\bin和gRPC的bin目录:

PATH=%PATH%;$(SolutionDir)..\..\wintools\bin;$(SolutionDir)..\..\subprojects\grpc-windows-x86-v1.41.1-dev-debug\bin

​ 多个dll查找路径用“;”隔开

代码风格

​ 代码风格使用clang-format来统一,在命令行或在IDE(Visual Studio、xcode)上构建都要使用clang-format来把所有代码给格式化。

# 项目中已经为Windows还有Mac OS写了两个脚本,执行下面的Target就会调用了,另外-C不一定需要build/release
meson compile -C build/release pretty_format

​ 另外Visual Studio是支持clang-format的,按下“;”分号或者保存,会触发Visual Studio自动应用项目根目录下的.clang-format文件,另外选中代码然后Ctrl+K,Ctrl+F也可以主动触发。并且也有一个LLVM官方的ClangFormat扩展:https://marketplace.visualstudio.com/items?itemName=LLVMExtensions.ClangFormat配合。

​ 不过Visual Studio 2015自带的clang-format版本比较老,有些开关不支持,会报错,所以这里把一些会报错的开关给注释掉了。

​ 果执行githooks/setup_hook可以安装一个git的pre-commit钩子,在commit前会自动检查执行pretty_format。

​ lint可以用cppcheck。

Plugins

​ WxBox使用lua来实现扩展,要注意的是,项目中的lua是C语言的构建版本而不是C++,所以“让出”、“错误处理”等操作用的是setjmp、longjmp来完成长跳转的,这会破坏栈帧结构,像在自定义封装的lua C函数内使用了C++的局部对象,那么是否能够调用对象的析构函数这是无法保证的,默认情况下,在Visual Studio编译环境由于编译器有补充了一些处理,所以可以调用析构函数,但是在Linux环境就不行。所以尽量不要在编写lua扩展的部分使用C++类对象。

plugins目录结构

+---plugins:存放所有包括纯文本和二进制的扩展; | +---common:存放“第三方”的lua库,比如:yaml库; | | ---libs:存放“第三方”的动态lua库 | +---libs:存放二进制的lua扩展 | | ---template:一个二进制扩展的模板,要想编写二进制的扩展可以参考这个模板。 | | ---subprojects | ---storage:供所有脚本存储配置信息、数据;

Plugin类型

​ 分为纯文本的扩展还有动态库的扩展,但WxBot识别为扩展并主动加载的只有plugins根目录下的纯文本lua,动态库类型还有其它第三方的lua都作为辅助的模块

热更新

​ wxbot会监控plugins文件夹的变化,根据实际情况来加载、卸载或重新加载扩展

Plugin事件

​ load、prereload和unload事件处理不接收参数,其它参数都会传递一个PluginEventModel,下面列出几个常用的事件

  • load:扩展加载事件,返回true表示初始化成功,返回false表示初始化失败;
  • prereload:扩展重载前事件,没有返回值;
  • unload:扩展卸载事件,没有返回值。
  • receive_text_message:微信接收文本消息,接收一个PluginEventModel,没有返回值
  • send_text_message:微信发送文本消息,接收一个PluginEventModel,没有返回值

Plugin任务超时机制

​ 为了避免Plugin中出现死循环或者耗时过长的调用,所以Plugin有超时机制,如果一个调用超过设定的时间,那么会被强制结束任务并让出

Storage

​ lua可以自由的在storage文件夹内存储配置文件和数据文件,尽量每个模块对应一个文件夹,用wxbox.package_storage_path(plugin_name)来获取给扩展使用的存储目录,或者通过plugin.storage_path来获取。

引入第三方的lua库

​ 纯文本的放在plugins/common根目录下,二进制的放进plugins/common/libs

Plugin命令调用语法(BNF)

​ statement ::= prefixexp methodcall

​ prefixexp ::= “>>

​ methodcall ::= method | method “:” arglist

​ method ::= methodname | modulename “.” methodname

​ arglist ::= expr {“,” expr}

​ expr ::= false | true | Numeral | LiteralString

可以执行Plugin命令的对象

​ 可调用的模块只有wxbox的内部模块还有在plugins根目录下的纯本文lua扩展,不过全局的函数可以任意调用

  • ​ filehelper联系人发送的文本消息
  • ​ wxbox执行命令

交互式调用语法测试工具interact

​ 这里提供一个interact工具来在控制台下交互式的测试Plugin的调用语法

image

WxBox Plugin API

​ 看plugins\wxbox_module_apis.txt文件

Plugin例子

​ 这个扩展的功能是,文件传输助手收到“关机”那么系统会定时2分钟后关机,“取消关机”就是取消这次关机任务,收到其它消息,在PC上会自动把文本语音播放出来。

helpme = declare_plugin('helpme')

function helpme.handle_filehelper_text_message(event)
    message = event:message()

    if (message == '关机') then
        wxbox.shell('shutdown', '/s /t 120')
    elseif (message == '取消关机') then
        wxbox.shell('shutdown', '/a')
    else
        wxbox.speak(message)
    end
end

local text_message_handler = {
    ['filehelper'] = helpme.handle_filehelper_text_message
}

function helpme.receive_text_message(event)
    text_message_handler[event:wxid()](event)
end

install与打包方法

# ninja作为后端编译打包
meson setup build\release --buildtype=release
meson compile -C build\release
meson install -C build\release

​ 最终会被打包到build\dist\release目录下,build\install是一个过度路径,给meson执行install。这个项目里别用DESTDIR或者--prefix来重新指定打包路径,这不会生效。 ​ 打包最终会生成四个文件,分别是wxbox主体的.tar.xz和.zip包(它们内容相同),还有symbol的.tar.xz和.zip包。 ​ 另外别打包debug版本的,debug版有些运行时的依赖没有做处理。

运行环境

​ Windows 7以上

CoreDump分析

​ wxbox崩溃时会自动启动crashdumper进行转储,把源码和符号文件拷贝下来,在windbg上配置好源码和符号路径,然后执行

# windbg
!analyze -v

image

wxbox's People

Contributors

12crazypaul21 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.