Unity辅助工具_头部与svn

Unity调用者按钮增加PlaySideButton
using QQu;
using UnityEditor;
using UnityEngine;
[InitializeOnLoad]
public class PlaySideButton
{static PlaySideButton(){UnityEditorToolbar.RightToolbarGUI.Add(OnRightToolbarGUI);UnityEditorToolbar.LeftToolbarGUI.Add(OnLeftToolbarGUI);}private static bool mIsOpenPreview = false;private static void OnRightToolbarGUI(){if (GUILayout.Button("GM | 格子坐标 | 格子使用", GUILayout.MaxWidth(150), GUILayout.Height(21))){if (Event.current.button == 0){AudioController.GetInstance().PlayClickSound();UIMgr.Ins.Show<QQu.UI.GMView>().Task();}else if (Event.current.button == 2){BuildingGridTileMgr.Ins.SetTestShowCell();}else if (Event.current.button == 1){if(mIsOpenPreview==false)SceneMapManager.Ins.PreviewCell(PreviewCellTypeEnum.CanBuilding);elseSceneMapManager.Ins.ClosePreviewCell();mIsOpenPreview = !mIsOpenPreview;}}}private static void OnLeftToolbarGUI(){GUILayout.FlexibleSpace(); //从右开始排if (GUILayout.Button("更新 | 日志 | 提交", GUILayout.MaxWidth(110), GUILayout.Height(21))){if (Application.isPlaying){Debug.LogError("你游戏正在运行中");return;}string[] strCMD = { "update", "commit", "log" }; //更新 查看日志 提交string path = Application.dataPath.Replace("Assets", "");SVNHelper.StartSvnProc(strCMD[Event.current.button], path);}}
}
unity头部扩展基类ToolbarCallback
using System;
using System.Collections.Generic;
using System.Reflection;
using UnityEditor;
using UnityEngine;
#if UNITY_2019_1_OR_NEWER
using UnityEngine.UIElements;
#else
using UnityEngine.Experimental.UIElements;
#endif
//https://github.com/marijnz/unity-toolbar-extenderpublic static class ToolbarCallback
{static Type m_toolbarType = typeof(UnityEditor.Editor).Assembly.GetType("UnityEditor.Toolbar");static Type m_guiViewType = typeof(UnityEditor.Editor).Assembly.GetType("UnityEditor.GUIView");
#if UNITY_2020_1_OR_NEWERstatic Type m_iWindowBackendType = typeof(UnityEditor.Editor).Assembly.GetType("UnityEditor.IWindowBackend");static PropertyInfo m_windowBackend = m_guiViewType.GetProperty("windowBackend",BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);static PropertyInfo m_viewVisualTree = m_iWindowBackendType.GetProperty("visualTree",BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
#elsestatic PropertyInfo m_viewVisualTree = m_guiViewType.GetProperty("visualTree",BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
#endifstatic FieldInfo m_imguiContainerOnGui = typeof(IMGUIContainer).GetField("m_OnGUIHandler",BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);static ScriptableObject m_currentToolbar;/// <summary>/// Callback for toolbar OnGUI method./// </summary>public static Action OnToolbarGUI;public static Action OnToolbarGUILeft;public static Action OnToolbarGUIRight;static ToolbarCallback(){EditorApplication.update -= OnUpdate;EditorApplication.update += OnUpdate;}static void OnUpdate(){// Relying on the fact that toolbar is ScriptableObject and gets deleted when layout changesif (m_currentToolbar == null){// Find toolbarvar toolbars = Resources.FindObjectsOfTypeAll(m_toolbarType);m_currentToolbar = toolbars.Length > 0 ? (ScriptableObject)toolbars[0] : null;if (m_currentToolbar != null){
#if UNITY_2021_1_OR_NEWERvar root = m_currentToolbar.GetType().GetField("m_Root", BindingFlags.NonPublic | BindingFlags.Instance);var rawRoot = root.GetValue(m_currentToolbar);var mRoot = rawRoot as VisualElement;RegisterCallback("ToolbarZoneLeftAlign", OnToolbarGUILeft);RegisterCallback("ToolbarZoneRightAlign", OnToolbarGUIRight);void RegisterCallback(string root, Action cb){var toolbarZone = mRoot.Q(root);var parent = new VisualElement(){style = {flexGrow = 1,flexDirection = FlexDirection.Row,}};var container = new IMGUIContainer();container.style.flexGrow = 1;container.onGUIHandler += () =>{cb?.Invoke();};parent.Add(container);toolbarZone.Add(parent);}
#else
#if UNITY_2020_1_OR_NEWER
var windowBackend = m_windowBackend.GetValue(m_currentToolbar);// Get it's visual tree
var visualTree = (VisualElement) m_viewVisualTree.GetValue(windowBackend, null);
#else// Get it's visual treevar visualTree = (VisualElement)m_viewVisualTree.GetValue(m_currentToolbar, null);
#endif// Get first child which 'happens' to be toolbar IMGUIContainervar container = (IMGUIContainer)visualTree[0];// (Re)attach handlervar handler = (Action)m_imguiContainerOnGui.GetValue(container);handler -= OnGUI;handler += OnGUI;m_imguiContainerOnGui.SetValue(container, handler);#endif}}}static void OnGUI(){var handler = OnToolbarGUI;if (handler != null) handler();}
}[InitializeOnLoad]
public static class UnityEditorToolbar
{static int m_toolCount;static GUIStyle m_commandStyle = null;public static readonly List<Action> LeftToolbarGUI = new List<Action>();public static readonly List<Action> RightToolbarGUI = new List<Action>();static UnityEditorToolbar(){Type toolbarType = typeof(UnityEditor.Editor).Assembly.GetType("UnityEditor.Toolbar");#if UNITY_2019_1_OR_NEWERstring fieldName = "k_ToolCount";
#else
string fieldName = "s_ShownToolIcons";
#endifFieldInfo toolIcons = toolbarType.GetField(fieldName,BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static);#if UNITY_2019_3_OR_NEWERm_toolCount = toolIcons != null ? ((int)toolIcons.GetValue(null)) : 8;
#elif UNITY_2019_1_OR_NEWER
m_toolCount = toolIcons != null ? ((int) toolIcons.GetValue(null)) : 7;
#elif UNITY_2018_1_OR_NEWER
m_toolCount = toolIcons != null ? ((Array) toolIcons.GetValue(null)).Length : 6;
#else
m_toolCount = toolIcons != null ? ((Array) toolIcons.GetValue(null)).Length : 5;
#endifToolbarCallback.OnToolbarGUI = OnGUI;ToolbarCallback.OnToolbarGUILeft = GUILeft;ToolbarCallback.OnToolbarGUIRight = GUIRight;}#if UNITY_2019_3_OR_NEWERpublic const float space = 8;
#else
public const float space = 10;
#endifpublic const float largeSpace = 20;public const float buttonWidth = 32;public const float dropdownWidth = 80;
#if UNITY_2019_1_OR_NEWERpublic const float playPauseStopWidth = 140;
#else
public const float playPauseStopWidth = 100;
#endifstatic void OnGUI(){// Create two containers, left and right// Screen is whole toolbarif (m_commandStyle == null){m_commandStyle = new GUIStyle("CommandLeft");}var screenWidth = EditorGUIUtility.currentViewWidth;// Following calculations match code reflected from Toolbar.OldOnGUI()float playButtonsPosition = Mathf.RoundToInt((screenWidth - playPauseStopWidth) / 2);Rect leftRect = new Rect(0, 0, screenWidth, Screen.height);leftRect.xMin += space; // Spacing leftleftRect.xMin += buttonWidth * m_toolCount; // Tool buttons
#if UNITY_2019_3_OR_NEWERleftRect.xMin += space; // Spacing between tools and pivot
#else
leftRect.xMin += largeSpace; // Spacing between tools and pivot
#endifleftRect.xMin += 64 * 2; // Pivot buttonsleftRect.xMax = playButtonsPosition;Rect rightRect = new Rect(0, 0, screenWidth, Screen.height);rightRect.xMin = playButtonsPosition;rightRect.xMin += m_commandStyle.fixedWidth * 3; // Play buttonsrightRect.xMax = screenWidth;rightRect.xMax -= space; // Spacing rightrightRect.xMax -= dropdownWidth; // LayoutrightRect.xMax -= space; // Spacing between layout and layersrightRect.xMax -= dropdownWidth; // Layers
#if UNITY_2019_3_OR_NEWERrightRect.xMax -= space; // Spacing between layers and account
#else
rightRect.xMax -= largeSpace; // Spacing between layers and account
#endifrightRect.xMax -= dropdownWidth; // AccountrightRect.xMax -= space; // Spacing between account and cloudrightRect.xMax -= buttonWidth; // CloudrightRect.xMax -= space; // Spacing between cloud and collabrightRect.xMax -= 78; // Colab// Add spacing around existing controlsleftRect.xMin += space;leftRect.xMax -= space;rightRect.xMin += space;rightRect.xMax -= space;// Add top and bottom margins
#if UNITY_2019_3_OR_NEWERleftRect.y = 4;leftRect.height = 22;rightRect.y = 4;rightRect.height = 22;
#else
leftRect.y = 5;
leftRect.height = 24;
rightRect.y = 5;
rightRect.height = 24;
#endifif (leftRect.width > 0){GUILayout.BeginArea(leftRect);GUILayout.BeginHorizontal();foreach (var handler in LeftToolbarGUI){handler();}GUILayout.EndHorizontal();GUILayout.EndArea();}if (rightRect.width > 0){GUILayout.BeginArea(rightRect);GUILayout.BeginHorizontal();foreach (var handler in RightToolbarGUI){handler();}GUILayout.EndHorizontal();GUILayout.EndArea();}}public static void GUILeft(){GUILayout.BeginHorizontal();foreach (var handler in LeftToolbarGUI){handler();}GUILayout.EndHorizontal();}public static void GUIRight(){GUILayout.BeginHorizontal();foreach (var handler in RightToolbarGUI){handler();}GUILayout.EndHorizontal();}
}

svn工具辅助类 SVNHelper
using Microsoft.Win32;
using System;
using System.Diagnostics;
using System.IO;
using UnityEditor;
using UnityEngine;
public static class SVNHelper
{//Log[MenuItem("Assets/SVN/日志",false,1)]private static void RightClickLog(){var path = MySelectActiveObj();if (string.IsNullOrEmpty(path) == false){StartSvnProc("log", path);}}//更新[MenuItem("Assets/SVN/更新", false, 1)]private static void RightClickUpdate(){var path = MySelectActiveObj();if (string.IsNullOrEmpty(path) == false){StartSvnProc("update", path);}}//提交[MenuItem("Assets/SVN/提交", false, 1)]private static void RightClickCommit(){var path= MySelectActiveObj();if (string.IsNullOrEmpty(path)==false){StartSvnProc("commit", path);}}// 获取选中的对象private static string MySelectActiveObj(){ var selectedObjects = Selection.objects;if (selectedObjects.Length > 0){foreach (var obj in selectedObjects){// 检查选定对象是否是文件夹string path = AssetDatabase.GetAssetPath(obj);if (AssetDatabase.IsValidFolder(path)){string target = Application.dataPath.Replace("Assets", "")+path;return target;}}}return null;}public static int StartSvnProc(string cmd, string path, string url = "", bool closeOnEnd = false,string logMsg = ""){ProcessStartInfo startInfo = new ProcessStartInfo();
#if UNITY_EDITOR_WINvar tortoiseProcPath = GetTortoiseProcSvnPath();if (string.IsNullOrEmpty(tortoiseProcPath)){UnityEngine.Debug.LogError("TortoiseProc未找到");return 0;}startInfo.FileName = tortoiseProcPath;if (cmd.Equals("commit") && !string.IsNullOrEmpty(logMsg)){if (string.IsNullOrEmpty(url))startInfo.Arguments =$"/command:{cmd} /path:\"{path}\" /logmsg:{logMsg} /closeonend:{(closeOnEnd ? 2 : 0)}";elsestartInfo.Arguments =$"/command:{cmd} /path:\"{path}\" /url:\"{url}\" /logmsg:{logMsg} /closeonend:{(closeOnEnd ? 2 : 0)}";}else{if (string.IsNullOrEmpty(url))startInfo.Arguments = $"/command:{cmd} /path:\"{path}\" /closeonend:{(closeOnEnd ? 2 : 0)}";elsestartInfo.Arguments =$"/command:{cmd} /path:\"{path}\" /url:\"{url}\" /closeonend:{(closeOnEnd ? 2 : 0)}";}startInfo.RedirectStandardOutput = true;startInfo.UseShellExecute = false;#elif UNITY_EDITOR_OSXstartInfo.CreateNoWindow = true;startInfo.ErrorDialog = true;startInfo.UseShellExecute = false;startInfo.FileName = "/usr/local/bin/svn";startInfo.Arguments = $"{cmd} {url} {path}";startInfo.RedirectStandardOutput = true;UnityEngine.Debug.Log("start process = " + startInfo.Arguments);
#endifProcess svnUpProcess = new Process();svnUpProcess.StartInfo = startInfo;svnUpProcess.Start();svnUpProcess.WaitForExit();string output = svnUpProcess.StandardOutput.ReadToEnd();UnityEngine.Debug.Log("process output = " + output);var exitCode = svnUpProcess.ExitCode;svnUpProcess.Close();AssetDatabase.Refresh();return exitCode;}private static string GetTortoiseProcSvnPath(){try{RegistryKey key = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Default);var path = key.OpenSubKey("SOFTWARE").OpenSubKey("TortoiseSVN").GetValue("ProcPath").ToString();return path;}catch (Exception){string[] vols = { "C", "D", "E", "F", "G", "H" };string[] dirs ={@"Program Files",@"Program Files (x86)",};foreach (var vol in vols)foreach (var dir in dirs){string file = $"{vol}:\\{dir}\\TortoiseSVN\\bin\\TortoiseProc.exe";if (File.Exists(file))return file;}return null;}}
}
git工具辅助类 GitHelper
using Microsoft.Win32;
using System;
using System.Diagnostics;
using UnityEditor;
public class GitHelper
{public static bool StartGitProc(string cmd, string path, string outPath = ""){string gitProcPath = GetTortoiseGitProcPath();if (string.IsNullOrEmpty(gitProcPath)){UnityEngine.Debug.LogError("TortoiseGitProc未找到");return false;}ProcessStartInfo startInfo = new ProcessStartInfo();startInfo.FileName = gitProcPath;startInfo.Arguments = $"/command:{cmd} /path:\"{path}\"/closeonend:2";Process gitProcess = new Process();gitProcess.StartInfo = startInfo;gitProcess.Start();gitProcess.WaitForExit();if (gitProcess.ExitCode > 0){EditorUtility.DisplayDialog("提示", $"git {cmd} exit with code:{gitProcess.ExitCode}", "确定");return false;}return true;}public static string GetTortoiseGitProcPath(){try{RegistryKey key = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Default);var path = key.OpenSubKey("SOFTWARE").OpenSubKey("TortoiseGit").GetValue("ProcPath").ToString();return path;}catch (Exception){return null;}}
}相关文章:
Unity辅助工具_头部与svn
Unity调用者按钮增加PlaySideButton using QQu; using UnityEditor; using UnityEngine; [InitializeOnLoad] public class PlaySideButton {static PlaySideButton(){UnityEditorToolbar.RightToolbarGUI.Add(OnRightToolbarGUI);UnityEditorToolbar.LeftToolbarGUI.Add(OnLe…...
2025最新Postman、Apipost和Apifox API 协议与工具选择方案解析
作为一个一个每天和 API“打交道”的全栈开发者,我的日常就是在一堆请求回应之间探寻系统间的“沟通艺术”。熟悉 API 的各种协议和工具,几乎成了我的谋生技能。今天,我就把自己积累多年的“血泪教训”和经验打包成一篇文章,献给和…...
ARM SVC指令
在 ARM 汇编中,SVC(Supervisor Call)指令用于从用户模式切换到特权模式(如 Supervisor 模式),以便执行操作系统内核提供的服务。它通常用于系统调用。 具体作用 触发异常:执行 SVC 指令时&…...
MicroPython 智能硬件开发完整指南
第一部分:MicroPython 基础 1. MicroPython简介 定义:专为微控制器设计的精简Python 3实现,支持硬件直接操作。特点: 语法兼容Python 3,但移除复杂功能(如多线程)。支持GPIO、PWM、I2C、SPI等…...
DeepLabv3+改进8:在主干网络中添加SIM注意力机制|助力涨点
🔥【DeepLabv3+改进专栏!探索语义分割新高度】 🌟 你是否在为图像分割的精度与效率发愁? 📢 本专栏重磅推出: ✅ 独家改进策略:融合注意力机制、轻量化设计与多尺度优化 ✅ 即插即用模块:ASPP+升级、解码器 PS:订阅专栏提供完整代码 论文简介 在本文中,我们提出了…...
vue-cli3+vue2+elementUI+avue升级到vite+vue3+elementPlus+avue总结
上一个新公司接手了一个vue-cli3vue2vue-router3.0elementUI2.15avue2.6的后台管理项目,因为vue2在2023年底已经不更新维护了,elementUI也只支持到vue2,然后总结了一下vue3的优势,最后批准升级成为了vitevue3vue-router4.5element…...
电路原理(电容 集成电路NE555)
电容 1.特性:充放电,隔直流,通交流 2.电容是通过聚集正负电荷来存储电能的 3.电容充放电过程可等效为导通回路 4.多电容并联可以把容量叠加,但是多电容串联就不会,只会叠加电容的耐压值。 6.电容充放电时相当于通路&a…...
QEMU源码全解析 —— 块设备虚拟化(2)
接前一篇文章:QEMU源码全解析 —— 块设备虚拟化(1) 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM源码解析与应用》 —— 李强,机械工业出版社 特此致谢! 上一回讲解了几种虚拟化方式(全虚拟化、半虚拟化和硬件辅助虚拟化)的优缺点及其对比…...
[C++面试] 对通透比较器了解多少?(较少涉及,可跳过)
一、入门 1、什么是比较器 在 C 中,比较器是一个可调用对象(函数、函数对象或 Lambda 表达式),用于定义元素之间的比较规则。 用途:通常作为参数传递给标准库中的排序函数或关联容器,以指定元素的顺序。…...
nslookup的使用
nslookup 是一个网络管理命令行工具,用于查询域名系统 (DNS) 服务器来获取有关主机名和IP地址的信息。它可以帮助你检查DNS记录、解析域名到IP地址或者执行反向查找(从IP地址找到对应的域名)。下面是 nslookup 的一些基本用法: 基…...
ES5 vs ES6:JavaScript 演进之路
ES5 vs ES6:JavaScript 演进之路 JavaScript版本演进ES5 (ECMAScript 5)ES6 (ECMAScript 2015)版本演进时间线为什么ES6如此重要? ES5 vs ES61. 变量声明对比2. 函数特性对比3. 类和对象4. 模块化5. 解构和展开6. 字符串和模板字面量7. 数组和对象新方法…...
函数式编程的核心
函数式编程 函数式编程(funcitonal programming)其实是个很古老的概念。 高阶函数和内存分析 函数式一阶公民 函数式编程最鲜明的特点就是:函数式一等公民,指的是函数与其他数据类型一样,处于平等地位,可…...
【易康eCognition实验教程】006:在影像上添加文本
在某些情况下,希望能在影像上面显示文本文字,例如,一个地图的名称或者是多时相影像分析的年或月的显示。此外,文本如果作为一个规则集导出的部分则可以被纳入数字影像中。如下图所示: 若要添加文本,在影像视…...
Django ORM自定义排序的实用示例
在使用Django进行开发时,ORM(对象关系映射)是一个非常强大的工具。它让我们可以用Python代码直接操作数据库,而不需要写SQL语句。当我们需要对数据进行排序时,Django ORM同样提供了丰富的功能。今天,我们就…...
【后端】【ubuntu】 ubuntu目录权限查看的几种方法
在Ubuntu中,有多种方式可以查看目录或文件的权限,以下为你详细介绍常见的指令及其使用方法: 1. ls -l 命令 这是最常用的查看文件和目录权限的命令,-l 选项用于以长格式列出文件和目录的详细信息,其中就包含权限信息…...
C++【类和对象】(超详细!!!)
C【类和对象】 1.运算符重载2.赋值运算符重载3.日期类的实现 1.运算符重载 (1).C规定类类型运算符使用时,必须转换成调用运算符重载。 (2).运算符重载是具有特殊名字的函数,名字等于operator加需要使用的运算符,具有返回类型和参数列表及函数…...
如何简单预估大模型运行所需的显存
模型消耗的显存主要来源于模型参数,前向/反向,梯度以及优化器…… 1、为什么显存很重要 显存就是显卡的“仓库”和“高速公路”。 容量越大,能存储的图形数据就越多,就能支持更高分辨率、更高纹理质量的游戏或图形程序。 速度越…...
Excel 中如何实现数据透视表?
Excel 中如何实现数据透视表? 数据透视表(PivotTable)是 Excel 中强大的数据分析工具,能够快速汇总、分析和展示大量数据。本文将详细介绍如何在 Excel 中创建和使用数据透视表。 1. 数据透视表的基本概念 数据透视表是一种交互…...
C语言中getchar和putchar函数详解,理解多组数据输入的问题中的EOF(-1)
引言 C语言中getchar和putchar函数详解,理解多组数据输入的问题中的EOF(-1)。 1.getchar() 函数原型: int getchar ( void ); getchar() 函数返回用户从键盘输入的一个字符,使用时不带有任何参数。 程序运行到这个命…...
python基础知识补充
一.区分列表、元组、集合、字典: 二.输出: <1>格式化输出字符串: 格式符号转换%s字符串%d有符号的十进制整数%f浮点数%c字符%u无符号十进制整数%o八进制整数%x十六进制整数(小写ox)%X十六进制整数(大写OX)%e科…...
MySql自动安装脚本
一、脚本安装流程 1. 添加MySQL的Repository 使用wget命令从MySQL官方网站下载Yum Repository的RPM包。使用rpm -ivh命令安装下载的RPM包,以添加MySQL的Yum Repository。 2. 安装mysql-community-server 使用yum install -y mysql-community-server --nogpgchec…...
STM32-I2C通信外设
目录 一:I2C外设简介 二:I2C外设数据收发 三:I2C的复用端口 四:主机发送和接收 五:硬件I2C读写MPU6050 相关函数: 1.I2C_ GenerateSTART 2.I2C_ GenerateSTOP 3.I2C_ AcknowledgeConfig 4.I2C…...
【脚本】Linux一键扩大虚拟内存的大小
Linux增加虚拟内存其实很简单 就那几个命令,free、mkswap、swapon 但是方便起见我写成了脚本 使用方法 进入你的目录, nano ./install_swap.sh 下面的脚本全文复制,粘贴进去之后,按ctrlx后按y保存 然后运行以下命令 sudo bash …...
信号隔离器 0-20mA/0-10V模拟信号隔离模块变送器 一进二出高精度
信号隔离器 0-20mA/0-10V模拟信号隔离模块变送器 一进二出高精度https://item.taobao.com/item.htm?ftt&id766022047828 型号 一进二出 0-20mA 转0-20mA/0-10V MS-C12 一进二出 0-10V 转 0-20mA/0-10V MS-V12 信号隔离器 单组输出 MS-C1/V1 双组输出 MS-C12/V12 用于…...
Nat. Methods | scPerturb——单细胞扰动数据的标准化资源与统计分析方法
《Nature Methods》提出scPerturb资源平台,整合44个单细胞扰动数据集(涵盖转录组、表观组、蛋白组读值),并通过能量统计量(E-statistics)量化扰动效应,旨在解决单细胞扰动数据的互操作性差、缺乏…...
【易康eCognition实验教程】005:影像波段组合显示与单波段显示
文章目录 一、加载多波段影像二、单波段显示三、彩色显示一、加载多波段影像 二、单波段显示 如果导入的影像数据具有三个或者更多的波段,影像场景将自动以RGB(红绿蓝)模式默认显示,如上图所示。在视图设置(View Settings)窗口中使用单波段灰度显示(Single LayuerGrays…...
使用Process Explorer、Dependency Walker和PE信息查看工具快速排查dll动态库因库与库版本不一致导致的加载失败问题
目录 1、问题说明 2、使用Process Explorer查看目标dll动态库有没有动态加载起来 3、使用Dependency Walker查看xxpadll.dll库的库依赖关系,找到xxpadll.dll加载失败的原因 4、使用PE信息查看工具查看目标dll库的时间戳 5、关于xxsipstack2.dll中调用xxdatanet…...
Git的命令学习——适用小白版
浅要了解一下Git是什么: Git是目前世界上最先进的的分布式控制系统。Git 和其他版本控制系统的主要差别在于,Git 只关心文件数据的整体是否发生变化,而大多数其他系统则只关心文件内容的具体差异。Git 并不保存这些前后变化的差异数据。实际上…...
如何安全处置旧设备?
每年,数百万台旧设备因老化、故障或被新产品取代而被丢弃,这些设备上存储的数据可能带来安全风险。 如果设备没有被正确删除数据,这些数据往往仍可被恢复。因此,安全处置旧设备至关重要。 旧设备可能包含的敏感数据 旧设备中可能…...
Java 学习记录:基础到进阶之路(一)
今天,让我们深入到 Java 项目构建、基础语法及核心编程概念的领域,一探究竟。 软件安装及环境配置请查看之前更新的博客有着详细的介绍: IDEA软件安装&环境配置&中文插件-CSDN博客 目录 1.Java 项目构建基础 1.项目中的 SRC 目录…...
