要求:
在我编的程序里执行另外一个exe文件(文件名是problem.exe),并测出problem.exe的运行时间。说明:
该exe文件是用Tubro C或Pascal环境编译生成的。
双击problem.exe图标,会读入problem.in文件(已经有了),生成problem.out文件。测试程序:
我已经尝试的方法:1、[Shell]
执行:shell "c:\problem.exe",vbHide结果:显示执行时间为10ms左右***但是*** c:\ 并没有生成problem.out(这个输出文件对我以后的工程很重要)2、[ShellExecute]
定义:Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Const SW_SHOWNORMAL = 1执行:ShellExecute Me.hwnd, vbNullString, "problem.exe", vbNullString, "c:\", SW_SHOWNORMAL 结果:显示执行时间为30ms左右
***但是*** c:\ 并没有生成problem.out3、[WinExec]
定义:Private Declare Function WinExec Lib "kernel32" (ByVal lpCmdLine As String, ByVal nCmdShow As Long) As Long
Const SW_SHOWNORMAL = 1执行:WinExec "c:\problem.exe", SW_SHOWNORMAL结果:显示执行时间为10ms左右
***但是*** c:\ 并没有生成problem.out4、[shell]-调用命令行
执行:Shell "command.com /c c:\problem.exe", vbHide
结果:显示执行时间为20ms左右***但是*** c:\ 并没有生成problem.out请问,
一、究竟怎么样才能使得效果完全像双击图标呢?(即一定要生成problem.out文件)
二、怎么样保证侧的时间为problem.exe完整执行完的时间?

解决方案 »

  1.   

    附我的测试时程序:
    Private Declare Sub GetSystemTime Lib "kernel32" (lpSystemTime As SYSTEMTIME)Private Type SYSTEMTIME
        wYear As Integer
        wMonth As Integer
        wDayOfWeek As Integer
        wDay As Integer
        wHour As Integer
        wMinute As Integer
        wSecond As Integer
        wMilliseconds As Integer
    End TypePrivate Sub command1_Click()    Dim stStart As SYSTEMTIME
        GetSystemTime stStart
        
        Dim t As Currency
        'ShellExecute Me.hwnd, vbNullString, "problem.exe", vbNullString, "c:\", SW_SHOWNORMAL '打开文件路径
        'WinExec "c:\problem.exe", SW_SHOWNORMAL
        'Shell "command.com /c c:\problem.exe", vbHide
        'Shell "c:\problem.exe", vbHide
        
        Dim stNow As SYSTEMTIME
        GetSystemTime stNow
      
        t = CLng(stNow.wHour - stStart.wHour) * 60 * 60 * 1000 + _
            CLng(stNow.wMinute - stStart.wMinute) * 60 * 1000 + _
            CLng(stNow.wSecond - stStart.wSecond) * 1000 + _
            CLng(stNow.wMilliseconds - stStart.wMilliseconds)
            
        
        MsgBox "本程序已运行:" & CStr(t) & "毫秒"
        
    End Sub谢谢看贴,更谢回帖~~~
      

  2.   

    你的两个问题应该是同一个原因,如果你想得到确切的结果,必须使用同步方式执行,一下为同步执行一个外部程序的函数:Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
    Public Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As LongSub ShellWait(sCommandLine As String)               '等到外部程序执行完成
      Dim hShell As Long, hProc As Long, lExit As Long
      hShell = Shell(sCommandLine, vbHide)
      hProc = OpenProcess(&H400, False, hShell)
      Do
        GetExitCodeProcess hProc, lExit
        DoEvents
      Loop While lExit = &H103
    End Sub
      

  3.   

    非常感谢 Fanks(铁面人) 帮我解决了第二个问题
    测试时间为300ms,和实际执行时间一样,之前10ms的不符合事实。
    等到结贴时分一定送上,呵呵
      

  4.   

    为了进一步说明问题,我想把programe.exe和programe.in发出来,
    可以的话请你留下你的mail
    定速奉上~
      

  5.   

    啊??我机子上装的是kaspersky,我用网易发邮件也是通过其kaspersky检验的呀
    555...I'm innocent..
      

  6.   

    你看看那个problem.exe图标的属性选项,看看它运行problem.exe的时候是不是还带有其他的参数???
      

  7.   

    首先谢谢 lsftest() 。
    我看了一下:右键文件图标,有7个选项卡,常规、程序、字体、内存、屏幕、其它、兼容性;
    没有执行参数,只是problem.exe,没有像CS那种cs1.5.exe -console 那种。
    常规的exe文件右键,(比如vb6.exe)显示三个选项卡,常规、版本、兼容性。
    呵呵
      

  8.   

    那么可能是文件的路径问题你那个程序很显然是工作于dos下的试试把你的程序写好然后编译成exe,放到problem.exe的同一目录再运行看看。
      

  9.   

    噢。错了
    想了一想,更可能是调用的问题。试试这样调用(xp下):
    shell "cmd.exe /c c:\problem.exe",VbNormalFocus
      

  10.   

    lsftest,还是得不到输出文件我把两个文件源码贴出来:
    一、sushu.c
    在VC中新建一个C/C++的源文件,将以下代码粘进代码区// 程序功能为求出给定的两个整数之间所有素数之和
    #include<stdio.h>
    #include<string.h>
    #include<conio.h>
    #include<ctype.h>int     ReadDat(int *,int*);
    void    WriteDat();
    void    sushu(int,int);
    long    result=0;void main()
    {
      int pm,pn;
      if(ReadDat(&pm,&pn))
    {
        printf("OPEN sushu.in ERRO!\n\007");
        return;
    }
      sushu(pm,pn);
      WriteDat();
    }int ReadDat(int *ppm,int *ppn)
    {
      FILE *fp;
      if((fp=fopen("sushu.in","r"))==NULL) return 1;
      fscanf(fp,"%d",ppm);
      fscanf(fp,"%d",ppn);
      fclose(fp);
      return 0;
    }void WriteDat(void)
    {
      FILE *fp;
      fp=fopen("sushu.out","w");
      fprintf(fp,"%ld",result);
      fclose(fp);
    }
    void sushu(int m,int n)
    {
       int i,j;   for(i=m;i<n+1;i++)
        for(j=2;j<i+1;j++)
        {        if (i==j) result=result+i;
            if (i%j==0) break;
        }
            }
    请build成sushu.exe文件二、sushu.in
    新建记事本,文件名改为sushu.in
    输入:
    3 30000
    保存即可(注意3he30000之间只有一个空格)将sushu.exe和sushu.in放在同一目录下,双击sushu.exe会自动生成sushu.out(内容为:45675862)
    为什么同步执行(如上),缺得不到sushu.out呢?这几天一直抓狂中
    大家的答案对我很重要,谢谢帮忙~~
      

  11.   

    你不如把problem.exe的整个文件夹给我吧(如果有完整的安装程序那更好),顺便说说那软件的功能:
    [email protected]
      

  12.   

    另外说句题外话,虽然我不懂c/c++/vc,但粗略看了一下你帖的代码大胆说一句,你代码中求素数的方法效率很低请参考:
    http://www.netye.net/?p=45
      

  13.   

    感谢lsftest兄弟的帮忙,我问问题和这个c语言程序没有关系啊
    我在开发一个评分系统,面向信息学奥赛de,
    我的程序必须要执行选手做的.exe文件,生成.out文件,然后与我的测试.out文件比较,正确则给分
    现在困惑的是得不到.out文件,那我也就无法比较评分啦~
    (以上的c语言程序是一考生的答案,肯定效率不高了,呵呵)
    所以,请帮忙哈~谢谢
      

  14.   

    把相关文件都寄过来吧。[email protected]
      

  15.   

    lsftest,给你寄过去了,请查收
      

  16.   

    果然就是路径问题呀。
    我把你的压缩包解到c:\sushu里去,然后在程序中写:Private Sub Command1_Click()
    Shell "cmd.exe /c c:\sushu\sushu.EXE", vbNormalFocus
    End Sub生成exe,也放到c:\sushu里去,运行就看到结果了。。
    现在看来,可能是你用的系统与我不同,我的是xp,你用的是不是win9x系列????如果是要改成这样:Private Sub Command1_Click()
    Shell "command.com /c c:\sushu\sushu.EXE", vbNormalFocus
    End Sub生成exe放到那个文件夹里再试试看。
      

  17.   

    To lsftest,
    问题解决,异常感谢,呵呵
    一切原因出在我是在我一直没有将我编的程序生成exe文件,只是在vb里点执行的。
    将编译生成的.exe文件,放到和sushu.exe,sushu.in文件同一目录,执行,ok,如期生成sushu.out
    我太粗心了,再次感谢
    准备结帐,送份
    接好,哈哈