当前位置: 首页 > news >正文

创建插件 DLL 项目

Step 1: 创建插件 DLL 项目

在 Visual Studio 中创建一个新的 DLL 项目,并添加以下文件和代码。

头文件:CShapeBase.h

 

cpp

复制代码

#pragma once #include <afxwin.h> // MFC 必需头文件 #include <string> #include <vector> #include "tinyxml.h" // 使用 TiXml 库的 XML 支持 #include "CxImage.h" // 使用 CxImage 库的图像处理支持 enum EDrawShape { RECTANGLE, CIRCLE, LINE }; // 示例绘制形状类型枚举 class CShapeBase { public: CShapeBase(EDrawShape nDrawShape); virtual ~CShapeBase(); virtual void Draw(CDC* pDC) = 0; virtual void InertRootItem(TiXmlElement* ItemElement, CString sItem, CString str); virtual void InertRootItem(TiXmlElement* ItemElement, CString sItem, int value); virtual void InertRootItem(TiXmlElement* ItemElement, CString sItem, float value); virtual void LoadDetPara(TiXmlElement* pDetElement); virtual void OnDrawResult(CDC* pDC); EDrawShape GetShapeType(); protected: EDrawShape m_nDrawShape; std::vector<CPoint> m_points; };

源文件:CShapeBase.cpp

 

cpp

复制代码

#include "CShapeBase.h" CShapeBase::CShapeBase(EDrawShape nDrawShape) : m_nDrawShape(nDrawShape) {} CShapeBase::~CShapeBase() {} void CShapeBase::InertRootItem(TiXmlElement* ItemElement, CString sItem, CString str) { ItemElement->SetAttribute(std::string(CT2A(sItem)).c_str(), std::string(CT2A(str)).c_str()); } void CShapeBase::InertRootItem(TiXmlElement* ItemElement, CString sItem, int value) { ItemElement->SetAttribute(std::string(CT2A(sItem)).c_str(), value); } void CShapeBase::InertRootItem(TiXmlElement* ItemElement, CString sItem, float value) { ItemElement->SetDoubleAttribute(std::string(CT2A(sItem)).c_str(), value); } void CShapeBase::LoadDetPara(TiXmlElement* pDetElement) { // 加载检测参数的示例实现 } void CShapeBase::OnDrawResult(CDC* pDC) { // 示例绘制结果 } EDrawShape CShapeBase::GetShapeType() { return m_nDrawShape; }

派生类:CSetDetDamage.h

 

cpp

复制代码

#pragma once #include "CShapeBase.h" class CSetDetDamage : public CShapeBase { public: CSetDetDamage(); void Draw(CDC* pDC) override; void OnDrawResult(CDC* pDC) override; };

派生类实现:CSetDetDamage.cpp

 

cpp

复制代码

#include "CSetDetDamage.h" CSetDetDamage::CSetDetDamage() : CShapeBase(RECTANGLE) {} void CSetDetDamage::Draw(CDC* pDC) { CRect rect(10, 10, 100, 100); pDC->Rectangle(rect); } void CSetDetDamage::OnDrawResult(CDC* pDC) { // 定义特定的绘图逻辑,例如检测结果 }

导出函数的实现:Plugin.cpp

 

cpp

复制代码

#include "pch.h" #include "CSetDetDamage.h" extern "C" __declspec(dllexport) CShapeBase* CreateShapeInstance() { return new CSetDetDamage(); } extern "C" __declspec(dllexport) void DestroyShapeInstance(CShapeBase* pInstance) { delete pInstance; } extern "C" __declspec(dllexport) EDrawShape GetShapeType(CShapeBase* pInstance) { return pInstance->GetShapeType(); }

主程序示例代码

在主程序中,可以通过动态加载 DLL,调用导出的创建和销毁函数。

 

cpp

复制代码

#include <afxwin.h> #include <Windows.h> #include <iostream> #include "CShapeBase.h" typedef CShapeBase* (*CreateShapeFunc)(); typedef void (*DestroyShapeFunc)(CShapeBase*); typedef EDrawShape (*GetShapeTypeFunc)(CShapeBase*); class CMainApp : public CWinApp { public: BOOL InitInstance() override { CWnd wnd; wnd.Create(NULL, _T("Main Window")); HMODULE hModule = LoadLibrary(L"YourPlugin.dll"); if (!hModule) { std::cerr << "Failed to load DLL" << std::endl; return FALSE; } CreateShapeFunc createShape = (CreateShapeFunc)GetProcAddress(hModule, "CreateShapeInstance"); DestroyShapeFunc destroyShape = (DestroyShapeFunc)GetProcAddress(hModule, "DestroyShapeInstance"); GetShapeTypeFunc getShapeType = (GetShapeTypeFunc)GetProcAddress(hModule, "GetShapeType"); if (createShape && destroyShape && getShapeType) { CShapeBase* pShape = createShape(); CDC* pDC = wnd.GetDC(); pShape->Draw(pDC); EDrawShape shapeType = getShapeType(pShape); std::cout << "Shape type: " << shapeType << std::endl; destroyShape(pShape); wnd.ReleaseDC(pDC); } FreeLibrary(hModule); return TRUE; } }; CMainApp theApp;

编译和运行步骤

  1. 插件 DLL:编译并生成 YourPlugin.dll 文件。
  2. 主程序:通过 LoadLibrary 动态加载 DLL,并调用导出函数创建 CSetDetDamage 实例,绘制形状并获取形状类型。

注意事项

  • DLL 和主程序的字符集(如 Unicode 或 ANSI)应保持一致。
  • 使用 tinyxmlCxImage 库时,请确保库文件正确配置。
  • 为提高健壮性,可以在 DLL 导出函数中加入错误检查和异常处理逻辑。

4o

您说:

如果有N个插件如何实现和管理

ChatGPT 说:

ChatGPT

记忆已更新

要管理和实现多个插件,可以采用插件管理器(Plugin Manager)模式。该模式能够动态加载、卸载、并调用不同的插件,以下是一个实现方法:

1. 插件接口定义

定义一个通用接口,所有插件需要实现这个接口。可以创建一个基类 IPlugin,包含每个插件应实现的虚函数:

 

cpp

复制代码

class IPlugin { public: virtual ~IPlugin() {} virtual void Initialize() = 0; // 初始化插件 virtual void Execute() = 0; // 执行插件操作 virtual void Shutdown() = 0; // 关闭插件 };

2. 插件管理器类

创建 PluginManager 类来管理多个插件。该类可以动态加载 DLL、存储已加载插件的实例,并调用相应的接口方法。

 

cpp

复制代码

#include <vector> #include <string> #include <Windows.h> class PluginManager { public: void LoadPlugin(const std::string& dllPath); void UnloadPlugins(); void ExecuteAllPlugins(); private: struct PluginHandle { HMODULE hModule; IPlugin* instance; }; std::vector<PluginHandle> plugins; }; void PluginManager::LoadPlugin(const std::string& dllPath) { HMODULE hModule = LoadLibrary(dllPath.c_str()); if (hModule) { typedef IPlugin* (*CreatePluginFunc)(); auto CreatePlugin = (CreatePluginFunc)GetProcAddress(hModule, "CreatePluginInstance"); if (CreatePlugin) { IPlugin* plugin = CreatePlugin(); plugin->Initialize(); plugins.push_back({hModule, plugin}); } else { FreeLibrary(hModule); } } } void PluginManager::UnloadPlugins() { for (auto& plugin : plugins) { plugin.instance->Shutdown(); delete plugin.instance; FreeLibrary(plugin.hModule); } plugins.clear(); } void PluginManager::ExecuteAllPlugins() { for (auto& plugin : plugins) { plugin.instance->Execute(); } }

3. 插件 DLL 实现

插件 DLL 文件中实现 IPlugin 接口,并提供 CreatePluginInstance 导出函数。

 

cpp

复制代码

#include "IPlugin.h" class SamplePlugin : public IPlugin { public: void Initialize() override { // 初始化代码 } void Execute() override { // 执行插件的主要功能 } void Shutdown() override { // 资源清理 } }; extern "C" __declspec(dllexport) IPlugin* CreatePluginInstance() { return new SamplePlugin(); }

4. 插件的加载和管理

在主程序中,创建 PluginManager 的实例并加载所需的插件:

 

cpp

复制代码

int main() { PluginManager manager; manager.LoadPlugin("PluginA.dll"); manager.LoadPlugin("PluginB.dll"); manager.ExecuteAllPlugins(); manager.UnloadPlugins(); return 0; }

管理多个插件

  • 每个插件都通过路径加载,插件管理器可以灵活管理插件的数量。
  • ExecuteAllPlugins() 函数可以调用所有加载的插件方法,可以根据需要增加更复杂的管理操作,例如按插件类型调用或异步执行。

4o

您说:

#include "CShapeBase.h"这类头文件,主程序和dll都是一个文件,是吗

ChatGPT 说:

ChatGPT

在插件架构中,通常 主程序插件 DLL会共享某些头文件,比如接口类(如 IPlugin)和基类(如 CShapeBase)的定义,以确保两者之间的接口和数据结构保持一致。

为实现共享:

  1. 公共头文件:将CShapeBase.h等通用接口头文件放在一个公共的包含目录中,主程序和 DLL 项目都可以访问该目录中的文件。
  2. 主程序和 DLL 的分离:主程序和 DLL 不应在同一个源文件中实现。一般而言:
    • 主程序:包含插件管理器(PluginManager),并动态加载 DLL。
    • DLL:实现插件的功能,并包含从公共头文件中继承的接口和基类(如 CShapeBase 的实现)。

目录结构示例

 

less

复制代码

ProjectRoot/ ├── include/ │ ├── CShapeBase.h // 通用接口和基类头文件 │ └── IPlugin.h // 插件接口定义 ├── main_program/ // 主程序代码目录 │ ├── PluginManager.cpp │ └── main.cpp └── plugins/ // 插件代码目录 ├── PluginA/ │ ├── PluginA.cpp │ └── PluginA.def // 导出符号定义 └── PluginB/ ├── PluginB.cpp └── PluginB.def // 导出符号定义

在这种结构下:

  • 头文件:主程序和插件都可以包含 include/ 目录中的公共头文件。
  • 编译:主程序和 DLL 项目独立编译,但共享接口定义和基类头文件。
  • 加载:主程序通过插件管理器加载不同 DLL 插件的实例。

编译配置

  1. 主程序:将 include/ 目录配置为包含目录。
  2. DLL 项目:也需包含 include/ 目录,并实现导出的工厂函数(如 CreatePluginInstance())。

这样设置后,主程序和 DLL 都可以访问和使用 CShapeBase 类的定义,实现独立编译但共享结构的插件架构。

优点

  1. 代码解耦:将 CDrawTool 放入 DLL 中可以减少主程序的代码量,使代码更易维护。
  2. 便于更新:如果需要对 CDrawTool 类进行修改或更新,可以仅更新 DLL,而不必重新编译整个主程序。
  3. 扩展性:将绘图功能放在插件中,可以方便地为主程序添加更多功能,例如不同类型的绘图工具等。

实现要点

CDrawTool 类放到 DLL 中后,主程序需要使用动态链接库来加载和调用该类。实现中需要注意以下几点:

  1. 导出类:在 DLL 中将 CDrawTool 类标记为导出(__declspec(dllexport)),以便主程序可以访问该类。

     

    cpp

    复制代码

    #ifdef DRAWTOOL_EXPORTS #define DRAWTOOL_API __declspec(dllexport) #else #define DRAWTOOL_API __declspec(dllimport) #endif class DRAWTOOL_API CDrawTool { // 类定义 };

  2. 动态加载和接口设计:在主程序中,可以使用工厂函数(例如 CreateDrawToolInstance)来动态创建 CDrawTool 实例。工厂函数需要导出,以便主程序可以通过该函数获得 CDrawTool 的实例。

  3. 对象传递:确保主程序将 CWndCDC 等窗口资源传递给 DLL 中的 CDrawTool 实例,这样它就可以在主程序的窗口上绘图。

  4. 依赖管理:主程序和插件之间的类和数据结构应尽量保持一致,例如 CShapeBase 类和 EDrawShape 枚举等。

调用示例

假设 DLL 中导出一个工厂函数:

 

cpp

复制代码

extern "C" DRAWTOOL_API CDrawTool* CreateDrawToolInstance();

主程序可以这样使用:

 

cpp

复制代码

typedef CDrawTool* (*CreateDrawToolFunc)(); HINSTANCE hInst = LoadLibrary("DrawTool.dll"); CreateDrawToolFunc createFunc = (CreateDrawToolFunc)GetProcAddress(hInst, "CreateDrawToolInstance"); CDrawTool* pDrawTool = createFunc(); pDrawTool->SetDrawWnd(pMainWnd); // 传入主窗口实例 // 使用其他方法

这样,CDrawTool 类的所有实现都在插件 DLL 中完成,主程序无需直接依赖类的具体实现。

4o

您说:

那主界面class CCVideoWnd : public CStatic类里面如何使用CDrawTool它

ChatGPT 说:

ChatGPT

记忆已更新

要在主界面类 CCVideoWnd 中使用 CDrawTool(如果 CDrawTool 已移到插件 DLL 中),可以通过以下方式实现:

  1. 加载 DLL 和获取 CDrawTool 实例:在 CCVideoWnd 中,动态加载包含 CDrawTool 的 DLL,并通过导出函数来创建 CDrawTool 对象的实例。

  2. 使用导出函数创建对象:假设 DLL 中有一个导出函数,例如 CreateDrawTool,可以通过该函数创建 CDrawTool 的实例。

     

    cpp

    复制代码

    typedef CDrawTool* (*LPFN_CREATEDRAWTOOL)(); HMODULE hModule = LoadLibrary(_T("YourPluginDLL.dll")); if (hModule) { LPFN_CREATEDRAWTOOL pfnCreateDrawTool = (LPFN_CREATEDRAWTOOL)GetProcAddress(hModule, "CreateDrawTool"); if (pfnCreateDrawTool) { m_pDrawTool = pfnCreateDrawTool(); } }

  3. 调用 CDrawTool 成员函数:在 CCVideoWnd 中可以像操作普通对象一样调用 CDrawTool 的方法,但要确保 CDrawTool 的接口是公开的且可通过 DLL 边界调用。

  4. 释放资源:在 CCVideoWnd 的析构函数中销毁 CDrawTool 实例,并释放 DLL。

     

    cpp

    复制代码

    if (m_pDrawTool) { delete m_pDrawTool; m_pDrawTool = nullptr; } FreeLibrary(hModule);

通过这种方式,CCVideoWnd 类可以调用 DLL 中的 CDrawTool,而无需直接将 CDrawTool 放在主程序里。

相关文章:

创建插件 DLL 项目

Step 1: 创建插件 DLL 项目 在 Visual Studio 中创建一个新的 DLL 项目&#xff0c;并添加以下文件和代码。 头文件&#xff1a;CShapeBase.h cpp 复制代码 #pragma once #include <afxwin.h> // MFC 必需头文件 #include <string> #include <vector> #i…...

OpenCV双目相机外参标定C++

基于OpenCV库实现双目测量系统外参标定过程。通过分析双目测量系统左右相机拍摄的棋盘格标定板图像&#xff0c;包括角点检测、立体标定、立体校正和畸变校正的步骤&#xff0c;获取左右相机的相对位置关系和姿态。 a.检测每张图像中的棋盘格角点&#xff0c;并进行亚像素级精…...

【GESP】C++一级练习BCQM3055,4位数间隔输出

一级知识点取余、整除运算和格式化输出知识点应用。其实也可以用string去处理&#xff0c;那就属于GESP三级的知识点范畴了&#xff0c;孩子暂未涉及。 题目题解详见&#xff1a;https://www.coderli.com/gesp-1-bcqm3055/ https://www.coderli.com/gesp-1-bcqm3055/https://w…...

纯血鸿蒙的最难时刻才开始

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 纯血鸿蒙(HarmonyOS NEXT)也正式发布了&#xff0c;绝对是一个历史性时刻&#xff0c;但最难的鸿蒙第二个阶段&#xff0c;也就是生态圈的建设&#xff0c;才刚刚开始。 目前&#xff0c;我劝你现在不要升级到鸿蒙…...

记一个mysql的坑

数据库表user&#xff0c; 存在一个name字段&#xff0c;字段为varchar类型 现在user表有这么两条记录: idnameageclass1NULL18一班2lisi20二班 假如我根据下面这一条件去更新&#xff0c;更新成功数据行显示为0 update user set age 19 where age 18 and class “一班”…...

Java中的设计模式:单例模式详解

摘要 单例模式&#xff08;Singleton Pattern&#xff09;是Java中最常用的设计模式之一&#xff0c;属于创建型模式。它的主要目的是确保一个类在系统中只有一个实例&#xff0c;并提供一个全局访问点来访问该实例。 1. 单例模式的定义 单例模式确保一个类只有一个实例&…...

NanoTrack原理与转tensorrt推理

文章目录 前言一、NanoTrack 工作原理二、运行demo与转换tensorrt模型2.1 运行pt模型demo2.2 转onnx模型2.3 转tensorrt模型2.4 运行trt模型推理 三、推理速度对比总结 前言 NanoTrack 是一种轻量级且高效的目标跟踪算法&#xff0c;基于Siamese网络架构&#xff0c;旨在在资源…...

YOLO11改进 | 卷积模块 | 卷积模块替换为选择性内核SKConv【附完整代码一键运行】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 本文给大家带来的教程是将YOLO11的卷积替…...

CentOS进入单用户模式进行密码重置

一、单用户模式介绍 单用户模式是一种特殊的启动模式&#xff0c;主要用于系统维护和故障排除。在单用户模式下&#xff0c;系统以最小化的状态启动&#xff0c;只有最基本的系统服务会被加载&#xff0c;通常只有root用户可以登录。这种模式提供了对系统的完全控制&#xff0…...

bitpoke- mysql-operator cluster

sidecar版本只支持到8.0.35&#xff0c;35可以支持到mysql8.0.35 . 默认镜像是5.7的。需要自己打sidecar的镜像&#xff1a; # Docker image for sidecar containers # https://github.com/bitpoke/mysql-operator/tree/master/images/mysql-operator-sidecar-8.0 # 参考5…...

第5课 基本数据类型

一、数据类型的诞生 在Python的世界里&#xff0c;万物皆对象&#xff0c;每个对象都有自己的若干属性&#xff0c;每一个属性都能描述对象的某一个方面。就像我们每个人&#xff0c;都有自己的身高、年龄、姓名、性别等很多方面的信息&#xff0c;这里的身高、年龄、姓名、性…...

OceanBase 首席科学家阳振坤:大模型时代的数据库思考

2024年 OceanBase 年度大会 即将于10月23日&#xff0c;在北京举行。 欢迎到现场了解更多“SQL AI ” 的探讨与分享&#xff01; 近期&#xff0c;2024年金融业数据库技术大会在北京圆满举行&#xff0c;聚焦“大模型时代下数据库的创新发展”议题&#xff0c;汇聚了国内外众多…...

国内知名的几个镜像源

在国内&#xff0c;有许多常用的Python库镜像源可以帮助加速库的下载。以下是几个知名的镜像源&#xff1a; 1. 清华大学TUNA协会 网址: https://pypi.tuna.tsinghua.edu.cn/simple命令示例:pip install numpy --index-url https://pypi.tuna.tsinghua.edu.cn/simple2. 阿里云…...

海外著名新闻门户媒体软文发稿之华盛顿独立报-大舍传媒

在当今全球化的时代&#xff0c;信息传播的速度和范围达到了前所未有的程度。对于企业和个人而言&#xff0c;如何在国际舞台上有效地展示自己、传递信息&#xff0c;成为了一项至关重要的任务。而海外媒体发稿&#xff0c;特别是通过像华盛顿独立报这样的知名新闻门户&#xf…...

青少年编程与数学 02-002 Sql Server 数据库应用 13课题、函数的编写

青少年编程与数学 02-002 Sql Server 数据库应用 13课题、函数的编写 课题摘要:一、函数内置函数用户定义的函数 (User-Defined Functions, UDFs)使用示例主要特点 二、内置函数数学函数&#xff08;Mathematical Functions&#xff09;字符串函数&#xff08;String Functions…...

关于LaTeX的floatrow包导入后标题无法直接放到浮动体上方

排版一个文章&#xff0c;标题怎么弄都弄不到表格上方&#xff0c;经过阅读帮助文档才发现问题。又是一个坑。 标题位置控制 使用floatrow包之后&#xff0c;类似 \begin{table}[htbp]\caption{xxx。}\label{table1}\centering\begin{tabular}{lcccc}\toprule& \multicol…...

Flutter Image和Text图文组件实战案例

In this section, we’ll go through the process of building a user interface that showcases a product using the Text and Image widgets. We’ll follow Flutter’s best practices to ensure a clean and effective UI structure. 在本节中&#xff0c;我们将使用“Te…...

使用 xlrd 和 xlwt 库进行 Excel 文件操作

使用 xlrd 和 xlwt 库进行 Excel 文件操作 在数据分析和处理的过程中,Excel 文件是最常用的数据存储格式之一。Python 提供了多种库来处理 Excel 文件,其中 xlrd 和 xlwt 是两个经典的库,分别用于读取和写入 Excel 文件。本文将详细介绍如何使用这两个库进行 Excel 文件的操…...

03.04、化栈为队

03.04、化栈为队 1、题目描述 实现一个 MyQueue 类&#xff0c;该类用两个栈来实现一个队列。 2、解题思路 本题要求使用两个栈来实现一个队列。队列遵循先进先出&#xff08;FIFO&#xff09;的原则&#xff0c;而栈遵循后进先出&#xff08;LIFO&#xff09;的原则。因此…...

Coppelia Sim (v-REP)仿真 机器人3D相机手眼标定与实时视觉追踪 (二)

coppelia sim[V-REP]仿真实现 机器人于3D相机手眼标定与实时视觉追踪 二 zmq API接口python调用python获取3D相机的数据获取彩色相机的数据获取深度相机的数据用matpolit显示 python控制机器人运动直接控制轴的位置用IK运动学直接移动到末端姿态 相机内参的标定记录拍照点的位置…...

苏州金龙技术创新赋能旅游新质生产力

2024年10月23日&#xff0c;备受瞩目的“2024第六届旅游出行大会”在云南省丽江市正式开幕。作为客车行业新质生产力标杆客车&#xff0c;苏州金龙在大会期间现场展示了新V系V12商旅版、V11和V8E纯电车型&#xff0c;为旅游出行提供全新升级方案。 其中&#xff0c;全新15座V1…...

ceph pg stale 恢复

问题 如果 ceph -s 看到 ceph 有类似如下状态的 pg data:volumes: 1/1 healthypools: 5 pools, 113 pgsobjects: 6.94k objects, 22 GiBusage: 24 GiB used, 33 TiB / 33 TiB availpgs: 0.885% pgs not active366/13880 objects degraded (2.637%)...

Openlayers高级交互(8/20):选取feature,平移feature

本示例介绍如何在vue+openlayers中使用Translate,选取feature,平移feature。选择的时候需要按住shift。Translate 功能通常是指在地图上平移某个矢量对象的位置。在 OpenLayers 中,可以通过修改矢量对象的几何位置来实现这一功能。 效果图 配置方式 1)查看基础设置:http…...

uniapp renderjs页面传值

scrip标签里加 lang“renderjs” &#xff0c;可以使用原生js的dom&#xff0c;但是我在使用中发现以下问题&#xff0c;导致数据不能动态获取 1. onLoad获取上级页面传值 // APP不会触发&#xff0c;h5可以 2. props不会触发 解决办法添加 script 逻辑层数据传入渲染层 ren…...

AI赋能R-Meta分析核心技术:从热点挖掘到高级模型、助力高效科研与论文发表

Meta分析是针对某一科研问题&#xff0c;根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法&#xff0c;对来源不同的研究成果进行收集、合并及定量统计分析的方法&#xff0c;现已广泛应用于农林生态&#xff0c;资源环境等方面&#xff0c;成为Science、Nature论文的…...

AMD锐龙8845HS+780M核显 虚拟机安装macOS 15 Sequoia 15.0.1 (2024.10)

最近买了机械革命无界14X&#xff0c;CPU是8845HS&#xff0c;核显是780M&#xff0c;正好macOS 15也出了正式版&#xff0c;试试兼容性&#xff0c;安装过程和之前差不多&#xff0c;这次我从外网获得了8核和16核openCore&#xff0c;分享一下。 提前发一下ISO镜像地址和open…...

当事人单方委托专业机构或个人出具的书面意见,证据效力如何认定?

裁判要旨&#xff1a;当事人就专门性问题单方自行委托专业机构或者个人出具的书面意见&#xff0c;虽然不属于民事诉讼法上所称的由人民法院经由司法鉴定程序所获得的鉴定意见&#xff0c;但法律并未排除其作为证据的资格。对一方当事人就专门性问题自行委托有关机构或者人员出…...

AUTOSAR CP 中 BswM 模块功能与使用介绍(2/2)

三、 AUTOSAR BswM 模块详解及 ARXML 示例 BswM 模块的主要功能 BswM&#xff08;Basic Software Mode Manager&#xff09;模块在 AUTOSAR 架构中扮演着模式管理的核心角色。它负责管理车辆的各种模式&#xff08;如启动、运行、停车等&#xff09;&#xff0c;并根据不同的…...

PCB电路板为什么大多是绿色的

PCB电路板为什么大多是绿色的 1.绿色油墨为什么最常用&#xff1f;1.1.性能角度1.2.经济和历史角度1.3.人文和环保角度 2.误区&#xff1a;黑色PCB板更高端&#xff1f;3.总结 PCB电路板上面的绿色是一层阻焊油墨&#xff08;solder mask&#xff09;&#xff0c;主要作用&…...

Golang | Leetcode Golang题解之第508题出现次数最多的子树元素和

题目&#xff1a; 题解&#xff1a; func findFrequentTreeSum(root *TreeNode) (ans []int) {cnt : map[int]int{}maxCnt : 0var dfs func(*TreeNode) intdfs func(node *TreeNode) int {if node nil {return 0}sum : node.Val dfs(node.Left) dfs(node.Right)cnt[sum]if…...

短视频营销的优势和劣势/搜外seo视频 网络营销免费视频课程

本文实例为大家分享了centos yum安装mysql 5.6的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下1.检查系统是否安装其他版本的mysql数据#yum list installed | grep mysql#yum -y remove mysql-libs.x86_642.安装及配置# wget http://repo.mysql.com/mysql-communit…...

怎么把网站做二维码/网络营销企业有哪些公司

2019独角兽企业重金招聘Python工程师标准>>> Grid Control 、Data Grid、Spreadsheet、Data Editor、TreeList&#xff1a; 超乎你想象&#xff01;WinForms Grid Control处理100万行数据到底有多快&#xff1f;WinForms界面控件初探&#xff1a;处理速度飞快的WinF…...

wordpress图像描述/如何优化搜索引擎的准确性

理解AdamW 我们先弄清楚什么是weight decay 其实是在损失函数求导后&#xff0c;放在正则项前面的系数&#xff0c;比如L2正则&#xff0c;我们看一下weight decay的位置 我们可以认为λ就是weightdecaymin⁡wL2(w)min⁡wf(w)λ2n∑i1nwi2L2′(w)f′(w)λn∑i1nwi我们可以认为…...

大学生做的美食网站/天津抖音seo

在执行optimize表时&#xff0c;如果出现Repair with keycache时&#xff0c;说明tmp空间不够了...这时MySQL性能极低&#xff0c;又不能冒然kill掉进程&#xff0c;所以耐心等待操作完成吧。而内存足够的情况下&#xff0c;这种过程应该是提示Repair by sorting。如何避免这种…...

广告公司广告设计/手机百度关键词优化

1、百万年薪架构师实战视频 关键词“年薪” 2、基于MyCat的MySQL高可用读写分离集群 关键词“mycat” 3、RabbitMQ消息中间件技术精讲 关键词“rabbitmq” 4、Java读源码之Netty深入剖析 关键词“netty” 5、docker前后端分离项目 关键词“docker分离…...

如何拥有自己的私人网站平台/app推广方式有哪些

Orcad 画原理图的快捷键与allegro pcb不同&#xff0c;Orcad是无法修改快捷键的&#xff0c;只能使用系统自带的常用快捷键 I&#xff1a;放大原理图 O&#xff1a;缩小原理图 R&#xff1a;90度旋转 H&#xff1a;水平翻转...