当前位置:首页 > 芯闻号 > 充电吧
[导读]因为我是做嵌入式开发的,每次设备程序更新后都需要修改上位机,并且多个上位机,修改起来特麻烦,又不想用C#主要是底层使用的是C语言,配置解析通信等在单片机里面写好后可以直接复制到C++中使用,比较方便,

因为我是做嵌入式开发的,每次设备程序更新后都需要修改上位机,并且多个上位机,修改起来特麻烦,又不想用C#主要是底层使用的是C语言,配置解析通信等在单片机里面写好后可以直接复制到C++中使用,比较方便,我使用VC++开发比较方便,但是资料少,因此折腾了几晚上.

每次新产品都需要配一个上位机,并且本地配置与远程配置都需要重新开放配置程序,因此就想办法把配置模块变为一个动态的控件,一次开发后续2个程序都可以同时使用,使用了很多种方法,最后还是使用反射方式.


一.首先新建一个窗体控件DLL

将需要的界面从源程序拷贝过来



//对外接口函数,所有参数均为Object ^类型


		//输入的配置,用于设置输入配置的缓冲区
public:void Object_SetInConfig(Object ^Parameter)
		{
			if(Parameter == nullptr)
			{
				System::Windows::Forms::MessageBox::Show("内存不足!","错误",
					System::Windows::Forms::MessageBoxButtons::OK,System::Windows::Forms::MessageBoxIcon::Error);
				return;
			}
			SetInConfig((void*)Convert::ToInt32(Parameter));	//调用函数设置输入的配置参数

		}

	   //检查参数是否合法
public:Object ^Object_XF_CheckParameter(void)
	   {
		   Object ^temp = gcnew Object;

		   temp = this->CheckParameter();
		   return temp;
	   }

	   //存储配置
public:Object ^Object_SaveConfig(Object ^Parameter)
	   {
		   Object ^temp = gcnew Object;

		   if(Parameter == nullptr)
		   {
			   System::Windows::Forms::MessageBox::Show("内存不足!","错误",
				   System::Windows::Forms::MessageBoxButtons::OK,System::Windows::Forms::MessageBoxIcon::Error);
			   temp = false;
			   return temp;
		   }
		   temp = this->SaveConfig((void*)Convert::ToInt32(Parameter));
		   return temp;
	   }

	   //获取配置文件大小
public:Object ^Object_GetConfigSize(void)
	   {
		   Object ^temp = gcnew Object;

		   temp = this->GetConfigSize();
		   return temp;
	   }




二.动态加载调用


//通过方法名称获得方法
		System::Reflection::Assembly ^assembly;
		System::Type^ type;
		Object ^obj;
		System::Reflection::MethodInfo ^XF_SetInConfig;				//显示读取的配置
		System::Reflection::MethodInfo ^XF_CheckParameter;			//参数无误
		System::Reflection::MethodInfo ^XF_SaveConfig;				//存储配置
		System::Reflection::MethodInfo ^XF_GetConfigSize;			//获取配置大小	
		System::Reflection::MethodInfo ^XF_DefaultConfig;			//加载默认
		//动态加载DLL文件
		void LoadDLL(String ^pDLL)
		{
			try
			{
				this->assembly = System::Reflection::Assembly::LoadFrom(USER_LIB.GetRunningDirectory()+"\device\"+this->pDevDLL);	//加载DLL
			}
			catch (System::IO::FileNotFoundException^ e)
			{
				System::Windows::Forms::MessageBox::Show("找不到依赖的设备配置文件: "+this->pDevDLL+" 程序无法继续运行!","程序发生错误",
					System::Windows::Forms::MessageBoxButtons::OK,System::Windows::Forms::MessageBoxIcon::Error);
				Application::Exit();	//程序退出
				return;
			}
			this->type = this->assembly->GetType("XF_RTU_N_V1_0_CONFIG.XF_RTU_N_V1_0_CONFIGControl");
			this->obj = this->assembly->CreateInstance("XF_RTU_N_V1_0_CONFIG.XF_RTU_N_V1_0_CONFIGControl");
			
			this->panel1->Controls->Add((System::Windows::Forms::Control ^)this->obj);	//将DLL的控件加载到panel1并显示
			this->PerformLayout();

			//通过方法名称获得方法
			this->XF_SetInConfig = this->type->GetMethod("Object_SetInConfig");				//显示读取的配置
			this->XF_CheckParameter = this->type->GetMethod("Object_XF_CheckParameter");	//参数检查
			this->XF_SaveConfig = this->type->GetMethod("Object_SaveConfig");				//存储配置
			this->XF_GetConfigSize = this->type->GetMethod("Object_GetConfigSize");			//获取配置大小
			this->XF_DefaultConfig = this->type->GetMethod("DefaultConfig");				//加载默认
		}



//使用反射调用函数

1.无参数,无返回函数调用最简单


this->XF_DefaultConfig->Invoke(this->obj, nullptr);

2.带返回参数的函数调用,此处返回的是bool类型



if((bool)this->XF_CheckParameter->Invoke(this->obj, nullptr) == true)//检查参数
			 {
				 System::Windows::Forms::MessageBox::Show("配置参数无误!","提示",
					 System::Windows::Forms::MessageBoxButtons::OK,System::Windows::Forms::MessageBoxIcon::None);
				 this->toolStripStatusLabel1->Text = "参数检查无误";
			 }

3.带参数的函数调用需要使用cli::array< Object ^>^


将指针转化为int类型传入到参数表d中,此处只有1个形参,因此为

cli::array< Object ^>(1),多个按照实际填写.



cli::array< Object ^>^  d = gcnew cli::array< Object ^>(1);
				 d[0] = (int)&RTU_Config;	//获取指针并转化为int
				 this->XF_SaveConfig->Invoke(this->obj, d);			//存储配置



三.本地配置上位机与其它程序实现统一,一次编写,2个地方均可以使用


本地配置程序加载的配置控件




远程后台加载的同样的控件

四.可实现同一个程序完成多个功能
同一个程序动态加载不同控件实现不同功能

五.通过与ini配置文件结合,可以在不修改程序代码的情况下增加新设备支持,类似于插件

[设备数量]
NUM=4

[设备类型]
TYPE0=XF-RTU(老版)
TYPE1=XF-RTU-N(标准版)
TYPE2=XF-RTU-N(双DTU版)
TYPE3=XF-RTU-M(精简版)

[设备说明]
INF0=第一代RTU
INF1=第二代低功耗RTU
INF2=第二代低功耗RTU
INF3=低功耗简版RTU口

[配置控件]
DLL0=XF_RTU_老版本.dll
DLL1=XF_RTU_N_V1_0_CONFIG.dll
DLL2=XF_RTU_N_V1_0_CONFIG.dll
DLL3=XF_RTU_N_V1_0_CONFIG.dll









本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

10月18日消息,据央视网财经频道报道,近日,一颗重达303.1克拉的黄色梨形钻石在迪拜苏富比拍卖行展出。这颗黄钻被美国宝石学院评定为现今全球最大的无瑕疵钻石,市场估价约为1500万美元(约合人民币1亿多元)。瑕疵,通常...

关键字: 反射

(全球TMT2022年7月8日讯)随着更多的科技公司杀入汽车赛道,智能汽车成为科技行业公认的,继智能手机之后的,下一个变革领域,是全场景智慧生活中的一个重要切入点。 而想要汽车逐渐走向智能化,激光雷达在其中发挥着...

关键字: 激光雷达 脉冲 OV 反射

(全球TMT2022年6月28日讯)专门开发有机半导体、显示器材料和零部件的韩国公司CLAP在6月28日宣布,该公司成功地为OLED显示器所用的相位差膜进行了本地化。CLAP所拥有的整体解决方案,能够创造定制化的液晶材...

关键字: LED显示器 相位差 OLED显示 反射

上海2022年5月19日 /美通社/ -- 5月19日,国际独立第三方检测、检验和认证机构德国莱茵TUV大中华区(简称"TUV莱茵")联合BOE(京东方)...

关键字: 显示屏 显示技术 反射 终端

(全球TMT2022年5月19日讯)5月19日,国际独立第三方检测、检验和认证机构德国莱茵TUV大中华区(简称"TUV莱茵")联合BOE(京东方)推出了显示屏全护眼显示标准。 该标准紧扣人眼生理特性和健康...

关键字: 显示屏 反射 电子显示屏 终端

(全球TMT2022年5月13日讯)近日,国内首个毫米波技术在安检领域的国家标准《毫米波全息成像人体安全检查设备》(GB/T 41482-2022)正式发布,拟于2022年11月1日实施。同方威视作为主要起草单位参与标...

关键字: 毫米波 电磁波 毫米波技术 反射

无线天线有多种类型,不过常见的有两种,一种是室内天线,优点是方便灵活,缺点是增益小,传输距离短;一种是室外天线。室外天线的类型比较多,一种是锅状的定向天线,一种是棒状的全向天线。室外天线的优点是传输距离远。比较适合远距离...

关键字: 天线 传输距离 计算机 反射

▼点击下方名片,关注公众号▼信号完整性问题三大点:反射、串扰、损耗。本文讲反射,思维导图如下:01反射是不可避免的。互连链路中瞬时阻抗一旦变化,产生阻抗突变,就会发生反射。下图为日常的版图设计走线:阻抗突变在版图设计中不...

关键字: 反射

信号完整性的定义\\n定义:信号完整性(Signal Integrity,简称SI)是指在信号线上的信号质量。差

关键字: 信号 反射 串扰

本文主要介绍反射的相关概念,反射产生的原因,反射的消除措施。

关键字: 反射 PCB设计
关闭
关闭