windows上可怕的DDE

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_40937909/article/details/80815437

简介

感性的认识

DDE就是dynamic data exchange的简称,
好像是windows的独有一个技术(和.NET有关?)

听得似乎不多,但是如果你尝试用Excel,
看到有的时候会发现Excel怎么有些栏位是会动的
然后你可能会发现app|topic!item这样的东西在那个栏位的公式里

这个就是DDE啦

理性的认识

基本上这个DDE感觉就是一个推送-订阅的概念。

首先你需要订阅,在Excel中,在公示栏输入app|topic!item的意思就是你要订阅名字为app的应用的主题topic
item(当然用其他语言也能订阅)

接着发送的部分(实际上发送的部分应该先于订阅,因为没有资料源你跟谁订阅),就是一个server,定期的通过API推送(这个过程貌似叫advise在DDE中)

概念很简单,然而网上资料实在是忒少了,我用谷歌试了好多关键字也没有介绍怎么架设一个DDE的server(大多数叫你用Excel去订阅人家应用的资料),那我好不容易出了坑,各位就尽量少进坑吧

Nodejs与DDE

我们需要用到的库是node-dde,看着那可怜的star数以及遥远的更新日期就知道这个protocol真的..

安装很简单就是

npm install node-dde

基本上来说会报错(说你的edge需要自己build,如果你对node常更新的话),不用管它

我们再安装edge,我们使用edge-js,这是原版的的一个fork,帮你pre-build过了,基本上8.x,9.x都木有问题。当然你也可以使用原版的edge,不过需要蛋疼的安装。

改node-dde

那因为我们用的edge-js,所以我们需要稍微改下node-dde。基本上没区别,唯一的区别是要把node_modules/node-dde/clients.js的第一行

var edge = require('edge');

改成

var edge = require('edge-js');

就好啦

Server(推送)

使用的方法很简单,你需要先给你的资料源起个名称?

var dde = require('node-dde');
server = dde.createServer('app');

对了,在node-dde上罗列了很多的Event,然而那些oncallback基本上就是给你console用的,返回的值没有任何用处(我就是在这里被卡了好久)

真正有用的是override这些函数

server.onBeforeConnect = function(topic) { return true; };
server.onAfterConnect = function(service, topic) {};
server.onDisconnect = function(service, topic) {};
server.onStartAdvise = function(service, topic, item, format) { return true; };
server.onStopAdvise = function(service, topic, item) {};
server.onExecute = function(service, topic, command) {};
server.onPoke = function(service, topic, item, data, format) {};
server.onRequest = function(service, topic, item, format) { return ''; };
server.onAdvise = function(topic, item, format) { return ''; };

基本上有用的是

server.onStartAdvise;

这函数负责处理有人送订阅请求的时候要怎么处理。
主要就是这边的format当为1的时候你就可以直接push文字资料,如果是别的format请你搜索(搜到算我输…)
所以我们就把format限制为1(故事貌似是这样的,像Excel之类会尝试多个format直到你说true,如果你用了默认的函数(不管如何都是true,那Excel会期待你送格式50016的数据给他(Excel的第一次尝试)…))

server.onStartAdvise  = function (service, topic, item, format) {
    return format === 1;
};

然后是

server.onAdvise;

这个函数就是发数据啦,这个就看你发挥了,我借用例子就是

var i = 0;
server.onAdvise = function (topic, item, format) {
    console.log("in onAdvise function");
    console.log(topic, item, format);
    return 'hello' + i++;
};

最后,你需要push这个动作,就是

server.advise('topic', 'item');

这个就是说我要广播topic',那具体广播的内容,

server.onAdvise;

里定义咯(理论上你应该在这个函数里根据参数topic,item, format去决定你要发送什么)

Client(订阅)

Excel

如前面所说,DDE就是一个单纯的协议
有了server,其实client是什么并无规定
如果上面的例子,我们在excel中输入
=app|topic!item
你应该就可以看到变化啦

node

node-dde支持client。
基本上一样

 dde.createClient('app', 'topic');

告诉订阅什么应用的什么主题
以及

client.startAdvise('item');

告知订阅的项目

其他的参考github的例子即可,然而给的例子实际有点坑,
因为我这边反正会自己退出,我猜是event loop的坑所以我最后加了个setInterval卡在底下。

var dde = require('node-dde');

client = dde.createClient('app', 'topic');


client.on('disconnected', function (service, topic, isDisposed, isServerInitiated) {
    console.log('Odisconnected: '
        + 'Service: ' + service
        + ', Topic: ' + topic
        + ', IsDisposed: ' + isDisposed
        + ', IsServerInitiated: ' + isServerInitiated);
});

client.on('advise', function (service, topic, item, text) {
    console.log('OnAdvise: '
        + 'Service: ' + service
        + ', Topic: ' + topic
        + ', Item: ' + item
        + ', Text: ' + text);
});

client.connect();


client.startAdvise('item');


setInterval(function () {
    console.log('500')
}, 500);
展开阅读全文

没有更多推荐了,返回首页