DDE是什么?具体应用是什么?该怎么用?

letian_now 2006-03-25 09:14:38
谢谢拉.
...全文
366 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
letian_now 2006-03-30
  • 打赏
  • 举报
回复
好拉,谢谢大家拉.
letian_now 2006-03-28
  • 打赏
  • 举报
回复
to AIRFLYNET(汪洋中的一条船):
你把完整的例子贴出来好么?

我看我能不能明白.
AIRFLYNET 2006-03-28
  • 打赏
  • 举报
回复
呵呵, 不行呀.
AIRFLYNET 2006-03-27
  • 打赏
  • 举报
回复
這個是與數據庫結合的完整應用了,vb 也快走到了盡頭,拿出來大家參考,
其中刪除了部分代碼, 實在是太長了,不知你是否能看明白.
AIRFLYNET 2006-03-27
  • 打赏
  • 举报
回复
Else
If Not DdeCmpStringHandles(hsz1, DDE_TOPICSRV) Then
DdeQueryString DDE_INST, hsz2, accdat, 15, CP_WINANSI
If DdeCmpStringHandles(hsz2, DDE_ITEMSRVDS) = 0 Then
accdat = Trim$(UserInfo.DBName) & Chr$(0)
CopyMemory bData, ByVal accdat, Len(accdat)
data = DdeCreateDataHandle(DDE_INST, bData, Len(accdat), 0, DDE_TOPICSRV, CF_TEXT, 0)
ElseIf DdeCmpStringHandles(hsz2, DDE_ITEMSRVSRV) = 0 Then
accdat = Trim$(UserInfo.DBServer) & Chr$(0)
CopyMemory bData, ByVal accdat, Len(accdat)
data = DdeCreateDataHandle(DDE_INST, bData, Len(accdat), 0, DDE_TOPICSRV, CF_TEXT, 0)
ElseIf DdeCmpStringHandles(hsz2, DDE_ITEMSRVUSER) = 0 Then
accdat = UserInfo.userName & Chr$(0)
CopyMemory bData, ByVal accdat, Len(accdat)
data = DdeCreateDataHandle(DDE_INST, bData, Len(accdat), 0, DDE_TOPICSRV, CF_TEXT, 0)
ElseIf DdeCmpStringHandles(hsz2, DDE_ITEMSRVPWD) = 0 Then
accdat = "caladus" & Chr$(0)
CopyMemory bData, ByVal accdat, Len(accdat)
data = DdeCreateDataHandle(DDE_INST, bData, Len(accdat), 0, DDE_TOPICSRV, CF_TEXT, 0)
ElseIf UCase$(Mid$(accdat, 1, 2)) = "CO" Then
Load_Buf = strCompanyName & Chr$(0)
CopyMemory bCompInfo, ByVal Load_Buf, Len(Load_Buf)
DDECallBack = DdeCreateDataHandle(DDE_INST, bCompInfo, Len(Load_Buf), 0, DDE_TOPICSRV, CF_TEXT, 0)
Exit Function
Else
DdeQueryString DDE_INST, hsz2, Load_Buf, Len(Load_Buf), CP_WINANSI
If UCase$(Mid$(Load_Buf, 1, 4)) = "CURR" Then
If UserInfo.CompanyCode <> "" Then
strSql = "select CURR from COMPANYINFO WHERE COMPCODE='" & UserInfo.CompanyCode & "'"
Else
strSql = "select CURR from COMPANYINFO"
End If
Set rstmp = New ADODB.Recordset
rstmp.Open strSql, ConGamma
Load_Buf = Trim$(rstmp.Fields(0)) & Chr$(0)
rstmp.Close
Set rstmp = Nothing
CopyMemory bData, ByVal Load_Buf, Len(Load_Buf)
data = DdeCreateDataHandle(DDE_INST, bData, Len(Load_Buf), 0, DDE_TOPICSRV, CF_TEXT, 0)
End If
End If
DDECallBack = data
End If
End If
End Select
Set rstmp = Nothing
Exit Function
ERR_CODE:
MsgBox Err.Description
Set rstmp = Nothing
End Function

Public Sub Init_DDE()
DDE_INST = 0

If DdeInitialize(DDE_INST, AddressOf DDECallBack, APPCLASS_STANDARD, 0) <> DMLERR_NO_ERROR Then
MsgBox "DDEªì©l¤Æ¿ù»~,­«·s¸ü¤J!", vbExclamation, "¿ù»~"
Else
DDE_TOPICSRV = DdeCreateStringHandle(DDE_INST, TOPIC_SRV, CP_WINANSI)
DDE_SERVICESRV = DdeCreateStringHandle(DDE_INST, SERVICE_SRV, CP_WINANSI)
DdeNameService DDE_INST, DDE_SERVICESRV, 0, DNS_REGISTER
DDE_TOPICACC = DdeCreateStringHandle(DDE_INST, TOPIC_ACC, CP_WINANSI)

DDE_ITEMSRVDS = DdeCreateStringHandle(DDE_INST, ITEM_SRV_DS, CP_WINANSI)
DDE_ITEMSRVUSER = DdeCreateStringHandle(DDE_INST, ITEM_SRV_USER, CP_WINANSI)
DDE_ITEMSRVSRV = DdeCreateStringHandle(DDE_INST, ITEM_SRV_SRV, CP_WINANSI)
DDE_ITEMSRVPWD = DdeCreateStringHandle(DDE_INST, ITEM_SRV_PWD, CP_WINANSI)
End If
End Sub

Public Sub Free_DDE()
Dim result As Boolean
If DDE_INST <> 0 Then
DdeNameService DDE_INST, DDE_SERVICESRV, 0, DNS_UNREGISTER
DdeFreeStringHandle DDE_INST, DDE_SERVICESRV
DdeFreeStringHandle DDE_INST, DDE_TOPICSRV
DdeFreeStringHandle DDE_INST, DDE_TOPICACC

DdeFreeStringHandle DDE_INST, DDE_ITEMSRVDS
DdeFreeStringHandle DDE_INST, DDE_ITEMSRVUSER
DdeFreeStringHandle DDE_INST, DDE_ITEMSRVSRV
DdeFreeStringHandle DDE_INST, DDE_ITEMSRVPWD

result = DdeUninitialize(DDE_INST)
End If
End Sub

Private Function PeriodSub(ByVal period As Long, ByVal offset As Long) As Long
On Error GoTo Err_Handle

End Function


AIRFLYNET 2006-03-27
  • 打赏
  • 举报
回复
這個是我們在vb 和 VC 中的應用程序與EXCEL 透過 DDE處理數據的方法.
Public Declare Function DdeCreateDataHandle Lib "user32" (ByVal idInst As Long, pSrc As Byte, ByVal cb As Long, ByVal cbOff As Long, ByVal hszItem As Long, ByVal wFmt As Long, ByVal afCmd As Long) As Long
Public Declare Function DdeCreateStringHandle Lib "user32" Alias "DdeCreateStringHandleA" (ByVal idInst As Long, ByVal psz As String, ByVal iCodePage As Long) As Long
Public Declare Function DdeUninitialize Lib "user32" (ByVal idInst As Long) As Long
Public Declare Function DdeInitialize Lib "user32" Alias "DdeInitializeA" (pidInst As Long, ByVal pfnCallback As Long, ByVal afCmd As Long, ByVal ulRes As Long) As Integer
Public Declare Function DdeNameService Lib "user32" (ByVal idInst As Long, ByVal hsz1 As Long, ByVal hsz2 As Long, ByVal afCmd As Long) As Long
Public Declare Function DdeCmpStringHandles Lib "user32" (ByVal hsz1 As Long, ByVal hsz2 As Long) As Long
Public Declare Function DdeQueryString Lib "user32" Alias "DdeQueryStringA" (ByVal idInst As Long, ByVal hsz As Long, ByVal psz As String, ByVal cchMax As Long, ByVal iCodePage As Long) As Long
Public Declare Function DdeFreeStringHandle Lib "user32" (ByVal idInst As Long, ByVal hsz As Long) As Long
Public Declare Function DdeFreeDataHandle Lib "user32" (ByVal hdata As Long) As Long

Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Public Const CF_TEXT = 1

Public Const DNS_REGISTER = &H1
Public Const DNS_UNREGISTER = &H2

Public Const XTYPF_NOBLOCK = &H2 ' CBR_BLOCK will not work

Public Const APPCLASS_STANDARD = &H0&

Public Const CP_WINANSI = 1004 ' default codepage for windows old DDE convs.

Public Const DMLERR_NO_ERROR = 0 ' must be 0
Public Const DMLERR_LOW_MEMORY = &H4007

Public Const XCLASS_BOOL = &H1000
Public Const XCLASS_DATA = &H2000

Public Const XCLASS_NOTIFICATION = &H8000
Public Const XTYP_DISCONNECT = (&HC0 Or XCLASS_NOTIFICATION Or XTYPF_NOBLOCK)
Public Const XTYP_UNREGISTER = (&HD0 Or XCLASS_NOTIFICATION Or XTYPF_NOBLOCK)
Public Const XTYP_CONNECT = (&H60 Or XCLASS_BOOL Or XTYPF_NOBLOCK)
Public Const XTYP_REQUEST = (&HB0 Or XCLASS_DATA)




Public DDE_SERVICESRV As Long
Public DDE_TOPICSRV As Long
Public DDE_TOPICACC As Long

Public DDE_INST As Long

Public DDE_ITEMSRVDS As Long
Public DDE_ITEMSRVSRV As Long
Public DDE_ITEMSRVUSER As Long
Public DDE_ITEMSRVPWD As Long

Public Const TOPIC_ACC = "Acc"
Public Const SERVICE_SRV = "KAL"
Public Const TOPIC_SRV = "System"

Public Const ITEM_SRV_DS = "DS"
Public Const ITEM_SRV_USER = "USER"
Public Const ITEM_SRV_SRV = "SRV"
Public Const ITEM_SRV_PWD = "PWD"

Public bData As Byte
Public bCompInfo As Byte


Public Function DDECallBack(ByVal uType As Long, ByVal uFmt As Long, ByVal hConv As Long, ByVal hsz1 As Long, ByVal hsz2 As Long, ByVal data As Long, ByVal data1 As Long, ByVal data2 As Long) As Long
On Error GoTo ERR_CODE
Dim accdat As String * 20
Dim Load_Buf As String * 256
Dim i As Integer
Dim straccdat As String
Dim p As String
Dim strSql As String
Dim period_offset As Long, period_to As Long, period_before As Long
Dim rstmp As ADODB.Recordset
Select Case uType
Case XTYP_CONNECT
DDECallBack = True
Case XTYP_UNREGISTER
DDECallBack = True
Case XTYP_REQUEST
If Not DdeCmpStringHandles(hsz1, DDE_TOPICACC) Then
DdeQueryString DDE_INST, hsz2, accdat, 15, CP_WINANSI
For i = 1 To Len(accdat)
If Mid$(accdat, i, 1) = Chr$(0) Then
Exit For
End If
straccdat = straccdat & Mid$(accdat, i, 1)
Next i
If StrComp(Mid$(straccdat, 1, 4), "DATE", vbTextCompare) = 0 Then
strSql = "SELECT " & straccdat & " FROM FINSTMT" 
     end if
Set rstmp = New ADODB.Recordset
rstmp.Open strSql, ConGamma
If Not (rstmp.EOF And rstmp.BOF) Then
accdat = rstmp.Fields(0) & Chr$(0)
Else
accdat = "0" & Chr$(0)
End If
rstmp.Close
Set rstmp = Nothing
CopyMemory bData, ByVal accdat, Len(accdat)
DDECallBack = DdeCreateDataHandle(DDE_INST, bData, Len(accdat), 0, DDE_TOPICACC, CF_TEXT, 0)
Exit Function
End If
p = Mid$(straccdat, 2, 1)
If IsNumeric(Mid$(p, 1, 1)) Then
period_offset = Val(p)
Else
period_offset = Asc(p) - Asc("a") + 10
End If
Set rstmp = New ADODB.Recordset
If UserInfo.CompanyCode <> "" Then
rstmp.Open "select min(P2) from FINSTMT WHERE COMPCODE='" & UserInfo.CompanyCode & "'", ConGamma
Else
rstmp.Open "select min(P2) from FINSTMT", ConGamma
End If
If Not IsNull(rstmp.Fields(0)) Then
period_to = rstmp.Fields(0)
period_before = PeriodSub(period_to, period_offset)
End If
rstmp.Close
Set rstmp = Nothing
Select Case LCase$(Mid$(straccdat, 1, 1))
Case "c"
Case "u"
Case "a"
Case "q"
Case "w"
strSql = "select round(sum(isnull(CR,0)),2) from FINSTMT where PARENT='" & UCase$(Trim$(Right$(straccdat, Len(straccdat) - 2))) & "' and PERIOD=" & period_before
End Select
CopyMemory bData, ByVal accdat, Len(accdat)
DDECallBack = DdeCreateDataHandle(DDE_INST, bData, Len(accdat), 0, DDE_TOPICACC, CF_TEXT, 0)
Exit Function
AIRFLYNET 2006-03-27
  • 打赏
  • 举报
回复
只是通过VB LinkMode、LinkTopic属性的设置是没什么意思的.
AIRFLYNET 2006-03-27
  • 打赏
  • 举报
回复
如果看不明白,那我也没什么办法了,只能看你的造化了,呵呵,
这里关系到一些特殊的地方,已被我删除了,但它还是一个完整
的例子.
AIRFLYNET 2006-03-27
  • 打赏
  • 举报
回复
你要仔细看了,如果直接VB 的属性做出来的DDE 有什么实际意义,我已给出了实际工作中的使用
例子,就是用API处理.
letian_now 2006-03-27
  • 打赏
  • 举报
回复
有那些参数?那些参数该怎么用呢?
vansoft 2006-03-27
  • 打赏
  • 举报
回复
所谓DDE技术,就是动态数据交换技术。也许你很奇怪,这与本文所讨论的内容有什么相干的?且听我慢慢讲来。

  为了实现拒绝运行并把已经运行的程序激活并实现各种功能,我们可以先用本文开头提到的方法,检测一下程序有没有被运行过,如果没有,就正常运行,如果已经被运行过,就打通与它的DDE通道,传给它一个(或一些)数据,然后由已经运行的程序对数据进行处理,再去实现各种“意想不到”的功能,这时也许就有人对这你的程序喊:“酷、酷……”

  好了,耳听为虚,眼见为实,下面让我们动点真格的。

  打开VB,新建一个工程,选择菜单中的“工程->工程1 属性”,把工程名称改为“P1”,把已有的一个窗体的“LinkTopic”属性改为“FormDDE”,把“LinkMode”属性改为“1 - Source”,添加一个PictureBox控件作为DDE执行控件,命名为picDDE。然后添加一个 TextBox控件,命名为“txtInfo”,并把“MultiLine”属性设置为“True”,以便显示多行文本,作为消息显示控件。

  最后在窗体代码区输入以下代码:
Const COMMANDLINE = "CommandLine=" 注释: 还是为了省事,定义一个常量

Private Sub Form_LinkExecute(CmdStr As String, Cancel As Integer)
Static lngCount As Long
Dim Info As String

Info = txtInfo.Text 注释: 保留原有信息

Select Case CmdStr 注释: CmdStr 是DDE程序传送过来的参数
Case "Max"
Me.WindowState = 2
Info = Info + vbNewLine + "窗体已被最大化"
Case "ShowTime"
Info = Info + vbNewLine + "最后一次运行这个程序的时间是:" + Str(Now)
Case "Count"
lngCount = lngCount + 1
Info = Info + vbNewLine + "你已经第" + Str(lngCount) + "次重复调用这个程序。" _
+ vbNewLine + "但怕您不多给工资,所以只运行了一个 ^_^"
End Select

If Left(CmdStr, Len(COMMANDLINE)) = COMMANDLINE Then
Info = Info + vbNewLine + "新程序曾以命令行形式运行" + vbNewLine + "命令行为:" _
+ vbNewLine + Right(CmdStr, Len(CmdStr) - Len(COMMANDLINE))
End If

txtInfo.Text = Info 注释: 把信息显示出来

Cancel = False

End Sub


Private Sub LinkAndSendMessage(ByVal Msg As String)
Dim t As Long
picDDE.LinkMode = 0 注释:--
picDDE.LinkTopic = "P1|FormDDE" 注释: |______连接DDE程序并发送数据/参数
picDDE.LinkMode = 2 注释: | “|”为管道符,是“退格键”旁边的竖线,
picDDE.LinkExecute Msg 注释:-- 不是字母或数字!

t = picDDE.LinkTimeout 注释:--
picDDE.LinkTimeout = 1 注释: |______终止DDE通道。当然,也可以用别的方法
picDDE.LinkMode = 0 注释: | 这里用的是超时强制终止的方法
picDDE.LinkTimeout = t 注释:--
End Sub


Private Sub Form_Load()
If App.PrevInstance Then 注释: 程序是否已经运行

Me.LinkTopic = "" 注释: 这两行用于清除新运行的程序的DDE服务器属性,
Me.LinkMode = 0 注释: 否则在连接DDE程序时会出乱子的

LinkAndSendMessage "Max" 注释:--
LinkAndSendMessage "Count" 注释: |-----连接DDE接受程序并传送数据/参数
LinkAndSendMessage "ShowTime" 注释:--

If Command <> "" Then 注释: 如果有命令行参数,就传递过去
LinkAndSendMessage COMMANDLINE + Command
End If
End 注释: 结束新程序的运行
End If
End Sub

  测试一下:

  把工程“P1”编译成EXE文件(设名称为 P1.EXE )

  1、打开“我的电脑”,找到 P1.EXE 并执行。可以看到程序正常运行了。

  2、再运行一次,这次新程序没有运行成功,而原来运行的程序却被最大化了,而且文本框中有以下字符:

  窗体已被最大化
  你已经第 1次重复调用这个程序

  但怕您不多给工资,所以只运行了一个 。

  最后一次运行这个程序的时间是:05-2-6 7:11:01

  3、打开 MS-DOS方式 ,用命令行方式再次运行程序,如 “P1 How Are You?”,这时原来运行的程序文本框中又多了几行字:

  窗体已被最大化
  你已经第 2次重复调用这个程序。
  但怕您不多给工资,所以只运行了一个
  最后一次运行这个程序的时间是:05-2-6 7:14:32

  新程序曾以命令行形式运行

  命令行为:

  How Are You?

  OK,运行完全正确,然后你就可以把它应用的你的程序中了。
letian_now 2006-03-27
  • 打赏
  • 举报
回复
看不明白,能不能给个教程什么的.

谢谢拉
vansoft 2006-03-25
  • 打赏
  • 举报
回复
在网络有一篇DDE的文章,用GOOGLE就能搜索到。
letian_now 2006-03-25
  • 打赏
  • 举报
回复
也是,谢谢拉
lzw858 2006-03-25
  • 打赏
  • 举报
回复
DDE是什么

是动态数据传输

具体应用是什么

主要用在两个EXE程序之间传送数据
比如:a.exe运行过程中要调用 b.exe程序,但要告诉B从哪里开始运行,B从A处得到数据,再判断数据,就知道怎么运行了
还有就是在程序快捷方式后面加参数运行,你看Windows优化大师,QQ,等好多程序的快捷方式都可以加参数以启动不同的功能

该怎么用

我也只知道设置哪LinkMode、LinkTopic属性,你看哪个实例嘛,一句一句的研究嘛,很容易懂的,再自己写个简单的就OK了,慢慢来
letian_now 2006-03-25
  • 打赏
  • 举报
回复
看了,但还是不甚明了.
lzw858 2006-03-25
  • 打赏
  • 举报
回复
http://old.ddvip.net/program/vb/index3/383.htm

看看这里

主要是LinkMode、LinkTopic属性
熊孩子开学喽 2006-03-25
  • 打赏
  • 举报
回复
DDE是很简单的,我这里给你一个现成的简单的例子:
建一个工程名叫:DDESOURCE,FORM1的LINKMODE属性设为:1-source; LINKTOPIC属性设为:FORM1
上面放一个TEXT控件,名为:TEXT1
编译成EXE,运行之.

再建一个工程:FORM1上放一个LABEL控件:
在FORM_LOAD 事件中写代码:
Private Sub Form_Load()
Label1.LinkTopic = "DDESOURCE|FORM1"
Label1.LinkItem = "TEXT1"
Label1.LinkMode = 1 'AUTO
End Sub

编译成EXE,运行之.

你可以看到LABEL1上显示的就是DDESOURCE的TEXT1上的内容了,并且你更改TEXT1中的内容,第二个程序上的LABEL1上的内容也会同步更改.

一定要先运行第一个工程,否则第二个工程运行时会找不到数据源报错

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧