请教pigpag老师关于DDE的问题(分不多了^x^)

BlueBeer 2004-06-10 12:35:08
根据你过去发的《用DDE技术为程序增辉》一文,我学写了下面的例子:
==========================================================
'DDE用法的简单例子
'新建工程,窗体上放一个Label1,设窗体LinkMode为1,添加代码:
Private Sub Form_LinkExecute(CmdStr As String, Cancel As Integer)
If Len(CmdStr) Then MsgBox (CmdStr) Else Me.SetFocus
Cancel = 0
End Sub

Private Sub SendDDEMsg(ByVal Msg As String)
With Label1
.LinkTopic = "工程1|Form1"
.LinkMode = 2
.LinkExecute Msg
End With
End Sub

Private Sub Form_Load()
If App.PrevInstance Then
Me.LinkTopic = ""
Me.LinkMode = 0
Call SendDDEMsg(Command)
Unload Me: End
Else
If Len(Command) Then MsgBox (Command)
End If
End Sub
==========================================================
编译后运行,能正常与另一实例进行对话,但仍有个小问题,即:如果在有过一次对话之后关闭程序,然后在极短的时间内再次运行程序,则会产生一个运行时错误282,几秒钟后再运行则完全正常
请教,是我的代码哪里有问题吗?可以避免这个错误的发生吗?
虽然不是大问题,但仍让我感觉不爽~
请赐教~
...全文
278 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
pigpag 2004-06-12
  • 打赏
  • 举报
回复
阿亚,Sorry,竟然让你没解决就结帖了……我失败……
BlueBeer 2004-06-12
  • 打赏
  • 举报
回复
算了,结了~
BlueBeer 2004-06-12
  • 打赏
  • 举报
回复
//原文中有一段是专门在连接后立刻断开的代码,就是设置LinkTimeOut为1,让DDE连接断开。

我按原文中的代码修改后,仍不能避免282错误,后来我直接用原文的代码生成新的程序,经测试,也不能避免我描述的情况下会出现的282错误,也许这是DDE的bug?

//老师……寒…………
//被我同学看见了——都被他嘲了~~^^

老师怎么了啊,三人行必有我师嘛,有的事上你是我老师,有的事上我可能也是你老师呢,呵呵,在编程这事上你当然是我老师啦
另,我后来发现,你整理我的FAQ时把我原文中的老师字样也都去掉了,呵呵
pigpag 2004-06-11
  • 打赏
  • 举报
回复
老师……寒…………

被我同学看见了——都被他嘲了~~^^
pigpag 2004-06-11
  • 打赏
  • 举报
回复
原文中有一段是专门在连接后立刻断开的代码,就是设置LinkTimeOut为1,让DDE连接断开。
BlueBeer 2004-06-11
  • 打赏
  • 举报
回复
再顶~
BlueBeer 2004-06-10
  • 打赏
  • 举报
回复
楼上的,我试着好像不存在这样的问题
我是这样做的,临时建个文本文件,把扩展名改为.aaa,然后使aaa文件与我例子中的“工程1.exe”建立关联,复制多份aaa文件,然后把它们一块拖动到“工程1.exe”的图标上,则得到正常的参数,格式为“文件1+空格+文件2+...”
换个方法试:选中多个aaa文件,然后在右键菜单里选“打开”,这时“工程1.exe”会被运行,同时也能得到两个参数,并没产生你说的错误,倒是有另一错误,如果右键打开的话,弹出多个Msgbox(多个参数),不关闭这些MsgBox的话,过一会就会产生一个运行时错误286,不知道为什么
不过我想是打开的方式不对吧,我试了下WMP(反正你也是做播放器的嘛),像上面的操作一样,右键打开多个文件的话,也只能打开最后一个文件,装了WMP9后,右键菜单中有一项“使用 Media PLayer 播放”,选择这一项可以打开多个文件,不知它是在哪里动了手脚,我在文件夹选项中以及注册表中都没有找到什么痕迹
BlueBeer 2004-06-10
  • 打赏
  • 举报
回复
自己顶~
幻影时空 2004-06-10
  • 打赏
  • 举报
回复
刚才说的同时打开是指同时打开多个文件(2个以上).:(
幻影时空 2004-06-10
  • 打赏
  • 举报
回复
我这还是不行,如果同时打开(文件关联的),就会提示:

------------------------------------
运行时错误:285

外部应用程序无法执行DDE方法或操作
------------------------------------

Form的LinkMode是设为vbLinkSource (1)了!

另外还有提示:

-----------------------------
运行时错误:91
未设置对象变量或with block变量
----------------------------

这个错误是可以解决的,我一怀疑是unload me 和end的问题,我程序中分别在:

Private Sub Form_Load()
If App.PrevInstance Then
Call SendDDEMsg(Command) 'InputBox("Message:")
Unload Me: End
End If
End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Unload Me: End
End Sub

Private Sub Form_Unload(Cancel As Integer)
Unload Me: End
End Sub

呵呵,可见有点重复...
我这样用的,就是防止在系统托盘显示的图标去除,但觉得还是无效,还有时会出现...


上边一系列问题,该如何解决?
ryuginka 2004-06-10
  • 打赏
  • 举报
回复
up
daisy8675 2004-06-10
  • 打赏
  • 举报
回复
mark
flyingZFX 2004-06-10
  • 打赏
  • 举报
回复
向楼主学习。。
James0001 2004-06-10
  • 打赏
  • 举报
回复
没问题,

Option Explicit

'DDE用法的简单例子
'新建工程,窗体上放一个Label1,设窗体LinkMode为1,添加代码:
Private Sub Form_LinkExecute(CmdStr As String, Cancel As Integer)
If Len(CmdStr) Then Label1.Caption = CmdStr: Me.SetFocus
Cancel = 0&
End Sub

Private Sub SendDDEMsg(ByVal Msg As String)
With Label1
.LinkTopic = App.Title & "|" & Form1.LinkTopic
.LinkMode = vbLinkManual
.LinkExecute Msg
End With
End Sub

Private Sub Form_Load()
If App.PrevInstance Then
Call SendDDEMsg(Command) 'InputBox("Message:")
Unload Me: End
End If
End Sub

注意把Form的LinkMode设为vbLinkSource (1)。
幻影时空 2004-06-10
  • 打赏
  • 举报
回复
我操作的方法是:选择多个文件后,再回车打开...

后来,经过多次,反反复复的测试:
发现,问题是来自linktimeout的,值默认是50(也就是5秒,我程序里使用1)!

由于这个可能会发现两种现象(等待响应DDE消息的时间):
一、重复执行后时间过短,第一次都没有执行完成——超时。

二、重复执行后时间过长,第一次执行的还没有关闭,第二次的又执行了,所以。。。

出现二的机会更多,我觉得关键是在这时间上的设置。

现在我加了
On error Resume Next
...

这样也可以防止错误,但是如果选择多个文件(例:16个)后,程序打开时间需要 非常久,甚至程序无响应。不过,这样的可能性也少,一般用户打开的文件也不至于这么多。。。

刚刚发现,还有X处的原因没有解决呢!

7,759

社区成员

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

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