Function InstallCService(CFolder, port)
    Dim BatCommand, ReturnValue
    BatCommand = CFolder & "\InstallServer\" & port & ".bat"
    ReturnValue = Shell("d:\TEMP\notepad.exe", 4)
    ReturnValue = Shell(BatCommand, 9)
End Function程序功能如下
首先生成一个BAT文件
然后从ASP中调用组件,由组件执行这个BAT文件很奇怪,ReturnValue能返回值,说明已经执行BAT文件,但是却没有相应的效果
我加了一行ReturnValue = Shell("d:\TEMP\notepad.exe", 4)进行测试
发现在进程中会出现notepad.exe但是看不到记事本,并且出现的进程无法结束请问由DLL引用外部文件该如何写,万分感谢!!!

解决方案 »

  1.   

    你先新建个普通工程,引用dll,测试一下:另外,
    Function InstallCService(CFolder, port)
        Dim BatCommand, ReturnValue
        BatCommand = CFolder & "\InstallServer\" & port & ".bat"
        ReturnValue = Shell("d:\TEMP\notepad.exe", 4)
        ReturnValue = Shell(BatCommand, 9)
    End Function中,函数InstallCService要声明为public的
    并且,你要给函数一个返回值,如果不需要返回值的话,就声明为过程最后,要看看你的bat文件
      

  2.   

    另外,你存放bat文件的目录,要设置足够高的权限供asp调用
      

  3.   

    DLL引用外部文件与普通exe引用外部文件一样,你的问题可能就像暴风雨所说,是目录和bat文件的权限问题。因为为了安全考虑asp的很多地方总是受限的。
      

  4.   

    谢谢诸位
    可是我们抛开BAT文件不谈
    我在d:\TEMP\放了notepad.exe
    执行之后,在进程中可以看到notepad.exe
    但是无法看到记事本,也无法结束进程。。
      

  5.   

    而且我的代码,在建立标准EXE文件中试过了,完全没有问题
      

  6.   

    还是asp保护的作用,用下面的API试试。
    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
      

  7.   

    我试了用
    ReturnValue  = ShellExecute(Handle, "open", "d:\bchat\notepad.exe", nil, nil, SW_SHOW)
    和用SHELL的效果还是一样的,有进程,没显示
    执行BAT文件还是没效果。。哭
      

  8.   

    //而且我的代码,在建立标准EXE文件中试过了,完全没有问题那就是权限的问题
      

  9.   

    //和用SHELL的效果还是一样的,有进程,没显示有结果吗?
      

  10.   

    Dim i As Long
      i = Shell("C:\WINDOWS\System32\calc.exe", vbNormalFocus)
      

  11.   

    asp代码:
    <%
    Set myobj=Server.CreateObject("G.XXXClient") 
    call myobj.InstallChatService(CFolder,port)
    Set myobj=nothing
    %>
    bat文件代码:
    d:\cserver\xserver.exe -install d:\cserver\port\port.ini
    DLL文件代码:
    Function InstallCService(CFolder, port)
        Dim BatCommand, ReturnValue
        BatCommand = CFolder & "\InstallServer\" & port & ".bat"
        ReturnValue = Shell(BatCommand, 9)
    End Function程序完成功能
    1 通过组件生成BAT文件installservice.bat
    2 通过ASP代码调用DLL组件,由DLL组件执行installservice.bat
    3 通过执行installservice.bat驻留系统服务
    4 通过WMI启动此系统服务
    5 通过WMI修改此系统服务状态为自动运行目前遇到问题就是
    第二步 在调用DLL组件执行installservice.bat时,无法正确执行,导致服务无法驻留
    第五步 不知道如何通过WMI修改系统服务为自动运行以下是WMI部分代码:
        strComputer = "."
        Set Services = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
        Set ServiceObject = Services.Get("Win32_Service='xxx_port'")
        Response.Write ServiceObject.DisplayName    '显示名称
        Response.Write ServiceObject.State          '当前服务状态
        Response.Write ServiceObject.StartMode      '启动模式
        ServiceObject.StartService
      

  12.   

    关于使用WMI进行服务的启动,修改启动模式都解决了
    就是通过DLL调用外部文件没解决了,大家再帮帮忙啊,拜托了
      

  13.   

    这里有解决方案http://bbs.chinaz.com/UploadFile/2006-3/20063201033762974.rar见文件属性 说明