【VB开源代码栏目提醒】:网学会员在VB开源代码频道为大家收集整理了“VB中的DDE是什么技术 - 期刊论文“提供大家参考,希望对大家有所帮助!
VB 中的 DDE 是什么技术DDE用来在操作
系统中各程序间进行通讯用的。
使用 DDE 技术,为您的应用程序增辉 上网的朋友一定都用过
网络蚂蚁(Net Ants)的吧?不知你在使用过程中有没有注意过,那就是如果你想调动两个“蚂蚁”为您效力是不可能的--它总会把新运行的关闭。
这点在
VB 中很容易实现: Private Sub Form_Load If App.PrevInstance Then MsgBox 你已经运行这个应用程序了 End 退出新运行的程序 End If End Sub这样如果你运行这个程序后在运行它,它会弹出一个消息框并拒绝再次运行。
这非常容易。
而“蚂蚁”程序的妙处就在于:在重复运行“蚂蚁”时它不仅拒绝运行,而且能把已经运行的“蚂蚁”激活,这样用上面的程序就无能为力了。
但事实上实现拒绝运行并激活已运行的程序有多种方法: 1 、 用 FindWindow 函 数 得 到 已 经 运 行 窗 体 的 句 柄 ( HWND ) , 然 后 用SetActiveWindow 等 API 函数将其激活。
其缺点也很明显,那就是没法传递参数。
用2、 FindWindow 函数得到已运行窗体的句柄后用 SendMessage 的方法给窗体传送一个自定义消息(附带参数),然后在窗体中拦截并进行处理,但这样做要修改窗体的标准消息处理程序,用在 VC,BC 或 DELPHI 编写的程序中还行,但在
VB 中
工作量太大,并且容易发生“一 般保护行错误”使
VB 崩溃,不太可取(当然,如果你有足够的信心和不怕崩溃的精神,也可以试一下 _ )。
3、使用 DDE 技术。
所谓 DDE 技术,就是动态数据交换技术。
也许你很奇怪,这与本文所讨论的内容有什么相干的? 且听我慢慢讲来。
为了实现拒绝运行并把已经运行的程序激活并实现各种功能,我们可以先用本文开头提到的方法,检测一下程序有没有被运行过,如果没有,就正常运行,如果已经被运行过,就打通与它的 DDE 通道,传给它一个(或一些)数据,然后由已经运行的程序对数据进行处理,再去实现各种意想不到”的功能,这时也许就有人对这你的程序喊:“酷、酷……” _ 好了,耳听为虚,眼见为实,下面让我们动点真格的。
打开
VB,新建一个工程,选择菜单中的“工程-工程 1 属性”,把工程名称改为“P1”(我爱 偷懒,能短则短 _ ),把已有的一个窗体的“LinkTopic”属性改为“FormDDE”,把“LinkMode” 属性改为“1 - Source”,添加一个 PictureBox 控件作为 DDE 执行控件,命名为 picDDE。
然后添加一个 TextBox 控 件 , 命 名 为 “txtInfo” , 并 把 “MultiLine” 属 性 设 置 为“True”,以便显示多行文本,作为 消息显示控件。
最后在窗体
代码区输入以下
代码: Const COMMANDLINE CommandLine 还是为了省事,定义一个常量Private Sub Form_LinkExecuteCmdStr 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 最后一次运行这个程序的时间是: StrNow Case Count lngCount lngCount 1 Info Info vbNewLine 你 已 经 第 StrlngCount 次重复调用这个程序。
_ vbNewLine 但怕您不多给工资,所以只运行了一个 _ End Select If LeftCmdStr LenCOMMANDLINE COMMANDLINE Then Info Info vbNewLine 新
程序曾以命令行形式运行 vbNewLine 命令行为: _ vbNewLine RightCmdStr LenCmdStr - LenCOMMANDLINE End If txtInfo.Text Info 把信息显示出来 Cancel False End Sub Private Sub LinkAndSendMessageByVal Msg As String Dim t As Long picDDE.LinkMode 0 -- picDDE.LinkTopic P1FormDDE ______ 连 接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 次重复调用这个程序。
但怕您不多给工资,所以只运行了一个 _ 最后一次运行这个程序的时间是:00-2-6 7:11:01 3、打开 MS-DOS 方式 ,用命令行方式再次运行程序,如 “P1 How Are You” 这时原来运行的程序文本框中又多了几行字: 窗体已被最大化 你已经第 2 次重复调用这个程序。
但怕您不多给工资,所以只运行了一个 _ 最后一次运行这个程序的时间是:00-2-6 7:14:32 新程序曾以命令行形式运行 命令行为: How Are YouOK,运行完全正确,然后你就可以把它应用的你的程序中了。
当然,这只是一些个人心得,如有疏漏之出,还请各位大虾指正。