现已做到:为防止启动多个程序,在启动时检测有无多个实例,
若有,则通过DDE方式将命令行参数传递前一个实例,然后再结束本程序。但问题是,如果用资源管理器选择一批文件,通过右键“打开”时,
操作系统将会以每一个选定的文件作为参数,然后启动N个新的目标程序。
这时,只有第一个选定的文件能够传送,其它的都出错
285#“不能执行DDE方法”请问,能否让资源管理器多个选定的文件,启动一个目标程序?
(若目标程序还未运行,则还要启动它)
若无法做到,那如何设计目标程序,让其能在多个实例下正确传送参数?

解决方案 »

  1.   

    因为目标程序载入文件时要进行复杂操作,所以会产生很大的延时,所以DDE方法好像不太可行。
      

  2.   

    To vansoft(Vansoft Workroom):
    如何让资源管理器传送参数为数组?要知道你在资源管理器中选择的每一个文件,它都单独打开一个新的目标程序!
    也就是说:目标程序每次由资源管理器启动时只能得到一个文件名参数!!!另:打开方式对话框里有一个DDE选项,请问如何使用,请详细点
      

  3.   

    试试这种思路:
    1. 程序进入的时候,创建互斥体。其他实例如果发现互斥体已经存在,就停止初始化,并且不断检测另一个互斥体(命名一下:Mutex2)
    2. 创建了第一个互斥体的实例开始初始化,初始化完毕,能够接收DDE信息的时候,创建Mutex2
    3. 这样,其他等待着的实例检测到Mutex2被创建,于是将消息传入该实例,自身退出。具体的情况我就不清楚了,因为DDE我也不是很熟悉的
      

  4.   

    何时才能判断自己可以接受DDE消息了呢?现在我通过在Clipboard中设置一个标志,让后续副本程序等待(这个方法不太稳定)
    已经能做到在已经运行了一个实例的情况下正确接受后续参数,但若一次还未运行过,
    还是会出现DDE连接错误的信息,估计就是第一个实例的DDE接受窗体还未创建好。我想还是用SendMessage吧,但我不知如何发送与接收字符串信息?VB Clipboard 中有一个格式
    常数 数值 描述
    vbCFLink &HBF00 DDE 对话信息 
    不知这是啥意思,联机手册中也没提到,不知谁能详细说明一下!
      

  5.   

    //现在我通过在Clipboard中设置一个标志,让后续副本程序等待(这个方法不太稳定)还不如用互斥体,互斥体稳定~~ :)
    Declare Function CreateMutex Lib "kernel32.dll" Alias "CreateMutexA" (lpMutexAttributes As SECURITY_ATTRIBUTES, ByVal bInitialOwner As Long, ByVal lpName As String) As Long
    Declare Function OpenMutex Lib "kernel32.dll" Alias "OpenMutexA" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal lpName As String) As Long
    Declare Function ReleaseMutex Lib "kernel32.dll" (ByVal hMutex As Long) As Longhttp://expert.csdn.net/Expert/FAQ/FAQ_Index.asp?id=173472