### 动态数据交换 (DDE) #### 概述 动态数据交换(Dynamic Data Exchange,简称 DDE)是一种早期微软开发的技术,它允许在不同应用程序之间进行数据共享和交互操作。这种技术使得用户可以在一个程序中操作另一个程序的数据,例如在Microsoft Word中编辑Excel表格中的数据或控制其行为。本文将基于提供的部分代码示例来详细介绍如何在Word和Excel中通过Visual C++使用DDE。 #### 使用方法与示例 在介绍具体的实现方法之前,我们需要了解一些基础知识: - **DDE 的基本概念**:DDE 基于客户/服务器模型。发起数据请求的应用称为“客户”,提供数据的应用称为“服务器”。DDE 的通信是通过一系列消息来完成的。 - **DDE 的主要组成部分**:主要包括会话(Conversation)、主题(Topic)、项目(Item)和服务(Service)等。 ##### 创建 DDE 客户端 以下是一个简单的示例,演示如何创建一个 DDE 客户端来与 Excel 和 Word 进行交互: 1. **创建新项目**:在 Visual C++ 中创建一个新的 Win32 控制台应用程序,命名为 `DDEClient`。 2. **添加必要的头文件**:在 `DDEClient.cpp` 文件中添加以下头文件: ```cpp #include "windows.h" #include "ddeml.h" #include "stdio.h" ``` 3. **定义回调函数**:回调函数用于处理来自服务器的消息。 ```cpp HDDEDATA CALLBACK DdeCallback( UINT uType, // 事务类型 UINT uFmt, // 剪贴板数据格式 HCONV hconv, // 对话句柄 HSZ hsz1, // 字符串句柄 HSZ hsz2, // 字符串句柄 HDDEDATA hdata, // 全局内存对象句柄 DWORD dwData1, // 特定于事务的数据 DWORD dwData2 // 特定于事务的数据 ) { return 0; } ``` 4. **执行命令**:`DDEExecute` 函数用于向服务器发送执行命令。 ```cpp void DDEExecute(DWORD idInst, HCONV hConv, char* szCommand) { // 创建数据句柄并发送命令 HDDEDATA hData = DdeCreateDataHandle(idInst, (LPBYTE)szCommand, lstrlen(szCommand) + 1, 0, NULL, CF_TEXT, 0); if (hData == NULL) { printf("Command failed: %s\n", szCommand); } else { DdeClientTransaction((LPBYTE)hData, 0xFFFFFFFF, hConv, 0L, 0, XTYP_EXECUTE, TIMEOUT_ASYNC, NULL); } } ``` 5. **发送请求**:`DDERequest` 函数用于向服务器发送数据请求。 ```cpp void DDERequest(DWORD idInst, HCONV hConv, char* szItem, char* sDesc) { // 创建字符串句柄,并发送请求 HSZ hszItem = DdeCreateStringHandle(idInst, szItem, 0); HDDEDATA hData = DdeClientTransaction(NULL, 0, hConv, hszItem, CF_TEXT, XTYP_REQUEST, 5000, NULL); if (hData == NULL) { printf("Request failed: %s\n", szItem); } else { char szResult[255]; DdeGetData(hData, (unsigned char*)szResult, 255, 0); printf("%s%s\n", sDesc, szResult); } } ``` 6. **发送数据**:`DDEPoke` 函数用于向服务器发送数据。 ```cpp void DDEPoke(DWORD idInst, HCONV hConv, char* szItem, char* szData) { HSZ hszItem = DdeCreateStringHandle(idInst, szItem, 0); DdeClientTransaction((LPBYTE)szData, (DWORD)(lstrlen(szData) + 1), hConv, hszItem, CF_TEXT, XTYP_POKE, 3000, NULL); DdeFreeStringHandle(idInst, hszItem); } ``` 7. **主函数**:在 `main` 函数中调用上述函数来与 Excel 和 Word 进行交互。 ```cpp int main(int argc, char* argv[]) { char szApp[] = "EXCEL"; char szTopic[] = "C:\\Test.xls"; char szCmd1[] = "[APP.MINIMIZE()]"; char szItem1[] = "R1C1"; char szDesc1[] = "A1 Contains:"; char szItem2[] = "R2C1"; char szDesc2[] = "A2 Contains:"; char szItem3[] = "R3C1"; char szData3[] = "Data from DDE Client"; char szCmd2[] = "[SELECT(\"R3C1\")]"; // 这里可以添加更多对 Excel 和 Word 的操作 } ``` #### 应用场景 DDE 技术虽然已经相对过时,但在某些特定应用场景下仍然有用武之地,比如: - **自动化测试**:可以通过 DDE 控制其他应用程序,实现自动化测试流程。 - **数据集成**:可以在不同应用程序之间无缝传输数据,提高工作效率。 - **定制化工具开发**:可以根据特定需求开发工具,实现对其他应用程序的自动化控制。 #### 结论 通过上述示例,我们可以看到如何使用 Visual C++ 实现与 Excel 和 Word 的 DDE 交互。虽然 DDE 在现代软件开发中已经被更先进的技术所取代,但对于理解早期软件之间的通信机制以及在某些特殊情况下仍然具有一定的参考价值。











察看本文应用于的产品
查看机器翻译免责声明
文章编号 : 279721
最后修改 : 2007年1月29日
修订 : 3.1
概要
本文介绍如何在 Visual C++ 中使用动态数据交换 (DDE) 与 Excel 和 Word。
注意 : 当可能时,建议您使用自动化,不 DDE,与 Excel 或 Word。 Excel 和 Word 有提供通过不使用 DDE 可用的自动化功能的丰富对象模型。 Excel 5.0 版或更高版本和 Word 版本 7.0 和更高版本,支持自动化。
回到顶端
更多信息
sample DDE client
下面的示例使用一个 Excel 工作簿或 Word 文档 DDE 主题。
为 Excel,创建一个新工作簿 (C:\Test.xls),它包含数据在单元格 A 1 和 A 2 中。 用于 Word,创建包含文本的一个新的文档 (C:\Test.doc)。 在文档中文本的选择某些,而不是全部,并创建书签名为"MyBookmark"在该位置。 1. in Visual C++,create new Win32 Console Application named"DDEClient"。
2. 在应用程序向导,选择 A 简单应用程序 ,然后单击 完成 。
3. 替换 DDEClient.cpp 中的代码如下: #include "stdafx.h"
#include "windows.h"
#include "ddeml.h"
#include "stdio.h"
HDDEDATA CALLBACK DdeCallback(
UINT uType, // Transaction type.
UINT uFmt, // Clipboard data format.
HCONV hconv, // Handle to the conversation.
HSZ hsz1, // Handle to a string.
HSZ hsz2, // Handle to a string.
HDDEDATA hdata, // Handle to a global memory object.
DWORD dwData2) // Transaction-specific data.
{
return 0;
}
void DDEExecute(DWORD idInst, HCONV hConv, char* szCommand)
{
HDDEDATA hData = DdeCreateDataHandle(idInst, (LPBYTE)szCommand,
lstrlen(szCommand)+1, 0, NULL, CF_TEXT, 0);
if (hData==NULL) {
printf("Command failed: %s\n", szCommand);
}
else {
DdeClientTransaction((LPBYTE)hData, 0xFFFFFFFF, hConv, 0L, 0,
XTYP_EXECUTE, TIMEOUT_ASYNC, NULL);
}
}
void DDERequest(DWORD idInst, HCONV hConv, char* szItem, char* sDesc)
{
HSZ hszItem = DdeCreateStringHandle(idInst, szItem, 0);
HDDEDATA hData = DdeClientTransaction(NULL,0,hConv,hszItem,CF_TEXT,
XTYP_REQUEST,5000 , NULL);
if (hData==NULL)
{
printf("Request failed: %s\n", szItem);
}
else
{
剩余5页未读,继续阅读


- 粉丝: 1
- 资源: 14
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 基于广义benders分解法的综合能源系统优化规划附Matlab代码.rar
- 基于改进模拟退火(HDSA)优化无人机紧急着陆时的轨迹最优研究附Matlab代码.rar
- 基于价值认同的需求侧电能共享分布式交易策略附Matlab代码.rar
- 基于奖励的时间序列预测模型(RBTM)及其在预测地球自转动态和复杂行为(Δ-T值)中的应用附Matlab代码.rar
- 基于交替方向乘法(ADMM)的PAPR约束下传输波束成形器设计的方法研究附Matlab代码.rar
- 基于核插值的多模态沿测地线路径规划研究 附Matlab代码.rar
- 基于粒子群优化调整离散 PID 控制器研究附Matlab代码.rar
- 基于粒子群算法的电力系统无功优化研究(IEEE14节点)附Matlab代码.rar
- 基于交替方向乘法(ADMM)的PAPR约束下传输波束成形器设计的方法研究附Python代码.rar
- 基于粒子群优化算法的分布式电源选址与定容【多目标优化】【IEEE33节点】附Matlab代码.rar
- 基于粒子群优化算法的面向综合能源园区的三方市场主体非合作交易方法附Matlab代码.rar
- 基于粒子群优化和行为控制的无人机在最优多跳自组织网络中的部署附Matlab代码.rar
- 基于蒙特卡洛法的规模化电动车有序充放电及负荷预测附Python&Matlab代码.rar
- 基于粒子群优化算法的微电网调度(光伏、储能、电动车、电网交互)附Matlab代码.rar
- 基于蒙特卡诺的电动汽车对电网影响 数据+附Matlab代码.rar
- 基于蜜蜂算法求解电力系统经济调度附Matlab代码.rar


