Maison  >  Article  >  interface Web  >  Découvrez comment implémenter DDE à l'aide de JavaScript

Découvrez comment implémenter DDE à l'aide de JavaScript

PHPz
PHPzoriginal
2023-04-25 10:48:08827parcourir

JavaScript est un langage de script général, principalement utilisé pour implémenter des fonctions interactives dans les pages Web frontales. Cependant, nous pouvons également l'utiliser pour implémenter diverses opérations, et même l'utiliser pour implémenter DDE (Dynamic Data Exchange).

DDE est une méthode de communication inter-applications Windows (IPC). Il permet de partager des données entre deux ou plusieurs programmes. Plus précisément, il permet à une application Windows de transmettre des données à une autre, généralement une autre application en cours d'exécution.

Dans cet article, nous explorerons comment implémenter DDE à l'aide de JavaScript. Avant de commencer, assurez-vous d'avoir des connaissances de base sur l'utilisation de JavaScript et de Windows.

Comprendre le DDE

Avant de commencer, comprenons brièvement le DDE. DDE est une technologie IPC (Inter-Process Communication) sous Windows. Il permet aux applications d'envoyer et de recevoir divers messages et commandes. Comme nous l'avons mentionné précédemment, cela permet à une application d'envoyer des données à une autre application. C'est ce qu'on appelle l'application « expéditeur » et l'application « destinataire ».

Pour comprendre les fonctionnalités de DDE, vous devez comprendre les deux concepts suivants :

  • Client DDE : C'est l'application via laquelle nous envoyons des données.
  • Serveur DDE : C'est notre application qui reçoit les données.

Lorsque le client DDE envoie des données au serveur DDE, il regroupe d'abord les données dans une transaction DDE. Cette transaction DDE comprend les éléments suivants :

  • Nom de l'application
  • Nom du sujet
  • Nom de l'élément
  • Type d'opération (par exemple ouvrir, fermer, envoyer, etc.)
  • Statut (succès ou échec)

Le client DDE Les transactions DDE sont envoyées au serveur DDE. Lorsque le serveur DDE reçoit une transaction, il analyse la transaction, extrait les données (si nécessaire) et envoie une réponse au client DDE.

Voyons maintenant comment implémenter DDE à l'aide de JavaScript.

Implémentation du client DDE

L'implémentation du client DDE en JavaScript nécessite l'utilisation d'objets ActiveXObject. Cet objet est un type de « contrôle ActiveX » développé par Microsoft qui fournit des composants Windows courants permettant aux développeurs Web d'effectuer de nombreuses opérations Windows.

Ensuite, nous utiliserons l'objet ActiveXObject pour créer un client DDE.

Ce qui suit est un exemple simple qui montre comment créer un client DDE à l'aide de JavaScript :

function sendDDEMessage(appName, topicName, itemName, command) {
  var ddeClient = new ActiveXObject("DDE.DdeClient");
  ddeClient.Connect(appName, topicName);

  var ddeTransaction = ddeClient.BeginTransaction();
  var ddeData = ddeTransaction.AddItem(itemName);
  ddeTransaction.SetData(ddeData, command);
  ddeTransaction.SetFormats(ddeData, 1); // 1 = CF_TEXT
  ddeTransaction.CommitTransaction();
  
  ddeClient.Disconnect();
}

Comme indiqué ci-dessus, la fonction sendDDEMessage accepte quatre paramètres :

  • appName : l'application contenant le DDE serveur Nom du programme. appName:包含 DDE 服务端的应用程序名称。
  • topicName:包含 DDE 服务端上下文的名称。
  • itemName:包含在 DDE 服务端应用程序中要访问的对象的名称。
  • command:要发送到 DDE 服务端的命令或消息。

该函数首先使用 new ActiveXObject("DDE.DdeClient") 创建一个 DDE 客户端。接下来,它使用 Connect() 方法将客户端连接到指定的应用程序和主题。

接下来,它创建一个 DdeTransaction 实例,并使用 AddItem() 方法添加要访问的项目。然后,使用 SetData() 方法将要发送的命令或消息设置到 DdeData 实例中。最后,使用 SetFormats() 方法设置数据格式,这里使用的是 1,表示 CF_TEXT 格式。

最后,该函数使用 CommitTransaction() 方法提交事务,并使用 Disconnect() 方法断开客户端与 DDE 服务端的连接。

实现 DDE 服务端

虽然 DDE 服务端的实现比较复杂,但是我们可以使用 JavaScript 和 ActiveXObject 对象来轻松地模拟它。

在本例中,我们将模拟一个具有以下功能的 DDE 服务端:

  • 它可以接收来自客户端的命令,并将其保存在一个数组中。
  • 当它接收到一个名为 “get_commands” 的命令时,它将使用 returnCommandList() 方法返回一个包含先前收到的所有命令的字符串。

以下是 DDE 服务端的 JavaScript 代码:

function DDEServer(appName, topicName) {
  var self = this;
  self.appName = appName;
  self.topicName = topicName;
  self.commandList = [];

  self.connect = function() {
    self.ddeServer = new ActiveXObject("DDE.DdeServer");
    self.ddeServer.Register(appName, topicName);
  };

  self.disconnect = function() {
    self.ddeServer.Unregister();
  };

  self.handleTransaction = function(ddeTransaction) {
    var command = ddeTransaction.GetData(ddeTransaction.FirstItem);
    self.commandList.push(command);
  };

  self.returnCommandList = function() {
    return self.commandList.join('\r\n');
  };
}

如上所示,DDEServer 构造函数接受两个参数:appNametopicName,这些参数是用于连接到 DDE 服务端的应用程序和主题。

connect() 方法使用 new ActiveXObject("DDE.DdeServer") 创建一个 DDE 服务端,并使用 Register() 方法在指定的应用程序和主题下注册它。

disconnect() 方法使用 Unregister() 方法注销 DDE 服务端。

当 DDE 服务端收到事务时,handleTransaction() 方法被调用。它从事务中获取数据,并将其添加到服务端的命令列表中。

最后,当服务端接收到名为 “get_commands”的命令时,returnCommandList() 方法将使用 join()

topicName : Contient le nom du contexte du serveur DDE. 🎜🎜itemName : Contient le nom de l'objet auquel accéder dans l'application serveur DDE. 🎜🎜command : La commande ou le message à envoyer au serveur DDE. 🎜🎜🎜Cette fonction utilise d'abord new ActiveXObject("DDE.DdeClient") pour créer un client DDE. Ensuite, il utilise la méthode Connect() pour connecter le client à l'application et au sujet spécifiés. 🎜🎜Ensuite, il crée une instance DdeTransaction et ajoute l'élément auquel accéder à l'aide de la méthode AddItem(). Ensuite, utilisez la méthode SetData() pour définir la commande ou le message à envoyer dans l'instance DdeData. Enfin, utilisez la méthode SetFormats() pour définir le format des données. Ici, 1 est utilisé, indiquant le format CF_TEXT. 🎜🎜Enfin, la fonction utilise la méthode CommitTransaction() pour valider la transaction et la méthode Disconnect() pour déconnecter le client du serveur DDE. 🎜🎜Implémentation du serveur DDE🎜🎜Bien que l'implémentation du serveur DDE soit plus complexe, nous pouvons utiliser des objets JavaScript et ActiveXObject pour le simuler facilement. 🎜🎜Dans cet exemple, nous allons simuler un serveur DDE avec les fonctions suivantes : 🎜🎜🎜Il peut recevoir des commandes du client et les enregistrer dans un tableau. 🎜🎜Lorsqu'il recevra une commande nommée "get_commands", il utilisera la méthode returnCommandList() pour renvoyer une chaîne contenant toutes les commandes précédemment reçues. 🎜🎜🎜Voici le code JavaScript du serveur DDE : 🎜
<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
    <title>DDE Client Demo</title>
  </head>
  <body>
    <h1>DDE Client Demo</h1>
    <label for="command">Enter a command:</label>
    <input id="command" type="text">
    <button id="sendCommand">Send Command</button>
    <br>
    <label for="output">Output:</label>
    <textarea id="output"></textarea>
    <script>
      var ddeServer = new DDEServer("dde_demo", "demo_topic");
      ddeServer.connect();

      function sendCommand() {
        var command = document.getElementById("command").value;
        sendDDEMessage("dde_demo", "demo_topic", "command", command);
        var output = document.getElementById("output");
        output.value = sendDDEMessage("dde_demo", "demo_topic", "get_commands", "");
      }

      document.getElementById("sendCommand").addEventListener("click", sendCommand);
    </script>
  </body>
</html>
🎜Comme indiqué ci-dessus, le constructeur DDEServer accepte deux paramètres : appName et topicName, ces paramètres sont utilisés pour la connexion aux applications et thèmes du serveur DDE. 🎜🎜 La méthode connect() utilise new ActiveXObject("DDE.DdeServer") pour créer un serveur DDE et utilise la méthode Register() pour Enregistrez-le sous l’application et le thème spécifiés. 🎜🎜La méthode disconnect() utilise la méthode Unregister() pour vous déconnecter du serveur DDE. 🎜🎜Lorsque le serveur DDE reçoit la transaction, la méthode handleTransaction() est appelée. Il récupère les données de la transaction et les ajoute à la liste des commandes côté serveur. 🎜🎜Enfin, lorsque le serveur recevra la commande nommée "get_commands", la méthode returnCommandList() utilisera la méthode join() pour connecter toutes les commandes de la liste de commandes dans une chaîne et retournez-la. 🎜

测试示例

现在我们已经开始实现 DDE 客户端和服务端,让我们来看看一些示例。为了测试客户端和服务端,我们将创建一个简单的 HTML 页面,该页面包含两个文本框和两个按钮。第一个文本框将用于输入命令,第二个文本框将用于显示服务器端的响应。

在按钮上单击时,客户端将尝试连接到服务器端,并将命令发送到它。一旦服务器端接收到命令,它将保存它,并返回一个包含所有已接收到的命令的字符串。

以下是示例代码:

<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
    <title>DDE Client Demo</title>
  </head>
  <body>
    <h1>DDE Client Demo</h1>
    <label for="command">Enter a command:</label>
    <input id="command" type="text">
    <button id="sendCommand">Send Command</button>
    <br>
    <label for="output">Output:</label>
    <textarea id="output"></textarea>
    <script>
      var ddeServer = new DDEServer("dde_demo", "demo_topic");
      ddeServer.connect();

      function sendCommand() {
        var command = document.getElementById("command").value;
        sendDDEMessage("dde_demo", "demo_topic", "command", command);
        var output = document.getElementById("output");
        output.value = sendDDEMessage("dde_demo", "demo_topic", "get_commands", "");
      }

      document.getElementById("sendCommand").addEventListener("click", sendCommand);
    </script>
  </body>
</html>

如上所示,我们使用了 var ddeServer = new DDEServer("dde_demo", "demo_topic") 创建了一个 DDE 服务端,并使用 ddeServer.connect() 连接到它。

我们还定义了 sendCommand() 函数,该函数将获取命令并使用 sendDDEMessage() 函数将其发送到 DDE 服务端。然后,它将获取 DDE 服务端的响应并将其设置为第二个文本框中的值。

最后,我们监听按钮上的单击事件,并在单击时调用 sendCommand() 函数。

结论

在本文中,我们了解了什么是 DDE 和如何使用 JavaScript 和 ActiveXObject 对象实现它。虽然这种方法不是最佳的,但它可以让我们学习如何在 JavaScript 中使用 ActiveXObject 对象和 Windows API,以及如何进行应用程序和操作系统级别的操作。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn