DDE 的知识和使用
创建服务器
class BasicDDE:DdeServer
{
public BasicDDE(string ServiceName):base(ServiceName)
{
}
}
在主类中
private void MakeServer()
{
BasicDDE server = new BasicDDE("BasicDDE");
server.Register();
}
服务器的创建关键就是服务器名称。
创建客户端
private void MakeClient(string ServiceName,string topic)
{try
{
client = new DdeClient(ServiceName, topic,this);
client.Connect();
}
catch (Exception)
{
client = null;
MessageBox.Show("DDE Client Creation failed");
}
}
关键是对应的服务器名称和topic名称。
HotLink模式
类似于长连接,服务器可以主动推送相关信息给客户端。
这里的例子服务器开始定时器,每个一秒调用Advise函数
Advise("*", "*");
//向所有topic和item发送消息
发送的时候,会调用
protected virtual byte[] OnAdvise(string topic, string item, int format);
发送具体信息。
服务器全部代码
class BasicDDE:DdeServer
{
public System.Timers.Timer timer = new System.Timers.Timer();
public BasicDDE(string ServiceName):base(ServiceName)
{
timer.Elapsed += timer_Elapsed;
timer.Interval = ;
timer.SynchronizingObject = this.Context;
} void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
Advise("*", "*");
} protected override byte[] OnAdvise(string topic, string item, int format)
{
return System.Text.Encoding.UTF8.GetBytes("Server Advise:" + DateTime.Now.ToString());
}
}
客户端
在连接前注册Advice回调函数
client.Advise += client_Advise;
连接后针对某一个item建立hotlink
client.StartAdvise("myadvice", , true, );
全部代码
public partial class Form1 : Form
{
private DdeClient client;
public Form1()
{
InitializeComponent();
MakeServer();
} private void MakeClient(string ServiceName,string topic)
{
if(string.IsNullOrEmpty(ServiceName)||string.IsNullOrEmpty(topic))
{
MessageBox.Show("数值不可为空");
return;
}
try
{
client = new DdeClient(ServiceName, topic,this);
client.Advise += client_Advise;
client.Connect(); }
catch (Exception)
{ client = null;
MessageBox.Show("DDE Client Creation failed");
}
client.StartAdvise("myadvice", , true, );
} void client_Advise(object sender, DdeAdviseEventArgs e)
{
this.Text = "On Advise: " + e.Text;
} private void MakeServer()
{
BasicDDE server = new BasicDDE("BasicDDE");
server.Register();
server.timer.Start();
} private void connect_Click(object sender, EventArgs e)
{
MakeClient(tbDDEService.Text, tbTopic.Text);
}
}
执行命令
客户端执行调用
client.Execute("mycmd", );
命令名随意,
服务器调用
protected override ExecuteResult OnExecute(DdeConversation conversation, string command)
{
//命令处理
return ExecuteResult.Processed;
}
其中conversion.topic 可获取topic名称。
读写Item
这里用的都是同步操作,会等待直到超时,也可用异步。
写Item的值
client.Poke("myitem", DateTime.Now.ToString(), );
服务器响应函数
protected override PokeResult OnPoke(DdeConversation conversation, string item, byte[] data, int format)
{
return PokeResult.Processed;
}
应该根据item将data存储。
读Item的值
client.Request("myitem", )
服务器响应函数
protected override RequestResult OnRequest(DdeConversation conversation, string item, int format)
{
return new RequestResult(System.Text.Encoding.ASCII.GetBytes("Your Requested Data" + "\0"));
}
Macro的知识
使用记事本创建mymacro.mac的文件,
内容如下
Name MyMessage
Print "This is s messge!"
EndMacro
载入Macro
在控制台命令行输入 Macro "mymacro.mac"然后回车
输入Macro 然后回车,调出所有可用的Macro。
任何不在Name和Macro之间的命令在加载的时候被执行,可以用来做初始化。
执行Macro
输入macro的名字即可。比如MyMessage,然后回车
输入Macro "mymacro.mac", go 然后回车,如果文件包含多个macro,执行最后一个。
函数Macro
名称必须以$结束,具有返回值。
比如查看ChemStation执行路径,在控制台打印相关函数宏。Print _AutoPath$
删除Macro
Remove MyMessage即可
变量
字符串变量 末尾必须是$,
数值变量末尾不是$
本地变量,前面加 Local,作用范围是本Macro,不加则是全局变量
如果数值变量需要变成字符串显示,使用val$(NumberTwo)
Message$="Number ="+val$(NumberTwo)
系统变量
DDE 的知识和使用的更多相关文章
- Windows_Program_Via_C_Translate_Win32编程的背景知识/基础知识_包括基本输入输出机制介绍
Some Basic Background Story of The Win32 APIs Win32 API背景故事/背景知识 The Win32 application programming i ...
- 你必须知道的EF知识和经验
注意:以下内容如果没有特别申明,默认使用的EF6.0版本,code first模式. 推荐MiniProfiler插件 工欲善其事,必先利其器. 我们使用EF和在很大程度提高了开发速度,不过随之带来的 ...
- MySQL高级知识- MySQL的架构介绍
[TOC] 1.MySQL 简介 概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而 ...
- 学点HTTP知识
不学无术 又一次感觉到不学无术,被人一问Http知识尽然一点也没答上来,丢人丢到家了啊.平时也看许多的技术文章,为什么到了关键时刻就答不上来呢? 确实发现一个问题,光看是没有用的,需要实践.看别人说的 ...
- java中的字符串相关知识整理
字符串为什么这么重要 写了多年java的开发应该对String不陌生,但是我却越发觉得它陌生.每学一门编程语言就会与字符串这个关键词打不少交道.看来它真的很重要. 字符串就是一系列的字符组合的串,如果 ...
- [C#] C# 知识回顾 - 你真的懂异常(Exception)吗?
你真的懂异常(Exception)吗? 目录 异常介绍 异常的特点 怎样使用异常 处理异常的 try-catch-finally 捕获异常的 Catch 块 释放资源的 Finally 块 一.异常介 ...
- [C#] C# 知识回顾 - 学会处理异常
学会处理异常 你可以使用 try 块来对你觉得可能会出现异常的代码进行分区. 其中,与之关联的 catch 块可用于处理任何异常情况. 一个包含代码的 finally 块,无论 try 块中是否在运行 ...
- [C#] C# 知识回顾 - 学会使用异常
学会使用异常 在 C# 中,程序中在运行时出现的错误,会不断在程序中进行传播,这种机制称为“异常”. 异常通常由错误的代码引发,并由能够更正错误的代码进行 catch. 异常可由 .NET 的 CLR ...
- [C#] C# 知识回顾 - 异常介绍
异常介绍 我们平时在写程序时,无意中(或技术不够),而导致程序运行时出现意外(或异常),对于这个问题, C# 有专门的异常处理程序. 异常处理所涉及到的关键字有 try.catch 和 finally ...
随机推荐
- CKEditor5 输入文字时拼音和汉字同时输入问题
在使用 CKEditor5 + vue 时,出现输入文字时,拼音和文字一起输入到编辑器到问题.与之前项目中使用 ckeditor 的区别是,这次项目是在 python 架构下局部引入 ckeditor ...
- MNIST 数据集介绍
在学习机器学习的时候,首要的任务的就是准备一份通用的数据集,方便与其他的算法进行比较. MNIST数据集是一个手写数字数据集,每一张图片都是0到9中的单个数字,比如下面几个: MNIST数据库 ...
- java新建excel文件导出(HSSFWorkbook)
public ActionForward exportExcel(ActionMapping mapping, ActionForm form, HttpServletRequest request, ...
- 四十九. Zabbix报警机制 、 Zabbix进阶操作 、 监控案例
案例1:实现Zabbix报警功能 案例2:Zabbix自动发现 案例3:Zabbix主动监控 案例4:拓扑图与聚合图形 案例5:自定义监控案例 1 案例1:实现Zabbix报警功能 1.1 问题 沿用 ...
- the schema version of 'microsoft.aspnet.mvc' is incompatible with version of nuget
Nuget versioning issue with package restore http://stackoverflow.com/questions/12035976/nuget-versio ...
- Jumbled String (Kattis - jumbledstring)(思维题)
Problem Recall that a subsequence of a string is any string obtained by removing some subset of char ...
- 分享一个seata demo,讲两个个问题
Seata,阿里开源的分布式事务框架,多的我就不介绍了,了解详细介绍,请看官网.seata spring boot入门,可以看我上一篇博客<Spring boot微服务如何集成fescar解决分 ...
- 微信小程序之--(与唯品会来场粉红色的邂逅 ???)
Welcome to miaomiaoXiong's segmentfault 微信小程序之--(与唯品会来场粉红色的邂逅 ???) 买买买,虽然双十二刚过,可是唯品会的折扣却是依然火爆.一打开页面, ...
- pwn学习日记Day10 《程序员自我修养》读书笔记
第一章 从 Hello world 说起 抛出问题: 1.程序为什么要被编译器编译后才能执行? 2.编译器在把C语言程序转换成可以执行的机器码的过程中做了什么,怎么做的? 3.最后编译出来的可执行文件 ...
- centos7 安装 mysql(在线安装)
在CentOS中默认安装有MariaDB,这个是MySQL的分支,但为了需要,还是要在系统中安装MySQL,而且安装完成之后可以直接覆盖掉MariaDB. 1 下载并安装MySQL官方的 Yum Re ...