用 ShellExecute执行bat文件,怎么不行呀。

lxplxp 2006-07-19 04:43:37
我有一个Test.bat,在命令行下可以顺利执行,但是在程序中使用ShellExecute函数执行时,只是有一个DOS窗口闪了一下就没有了,不知道是什么原因,代码如下:
ShellExecute(Self.handle,'c:\test.bat',nil,nil,SW_SHOWNORMAL)
函数返回值是42。
test.bat如下:
@echo off
cls
rem call the preprocessor program
call v_pre16 /u:DFLT /cdrom /run:9510AV11
rem if any problems abort else run view
if errorlevel 1 goto end
call v_view16.exe /u:DFLT /cdrom /run:9510AV11
:end
echo.
echo.
...全文
1008 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
lxplxp 2006-07-19
  • 打赏
  • 举报
回复
十分感谢!
erhan 2006-07-19
  • 打赏
  • 举报
回复
或者直接使用winexec分别调用你那些执行文件
erhan 2006-07-19
  • 打赏
  • 举报
回复
可以在bat里加上 set path=%path%;c:\aaa;c:\bbb

c:\aaa和c:\bbb为你的执行文件的存储目录
CACACACACA 2006-07-19
  • 打赏
  • 举报
回复
假设BAT文件在C:\下.两种简单方法:

1.调用`SetCurrentDirectory()函数;如下:
procedure TForm1.Button1Click(Sender: TObject);
var
OldPath: PChar;
NewPath: String;
begin
NewPath := 'c:\';
SetCurrentDirectory( PChar(NewPath) );
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
ShellExecute(0,nil,PChar('test.exe'),nil,nil,SW_SHOWNORMAL);
end;

2,直接在倒数第二个参数设置路径
ShellExecute(0,nil,PChar('test.exe'),nil,'c:\',SW_SHOWNORMAL);
lxplxp 2006-07-19
  • 打赏
  • 举报
回复
找到问题原因了,使用程序执行目录是应用程序所在的目录,在这个目录下 无法调用v_pre16和v_view16.exe,而test.bat文件与v_pre16和v_view16.exe程序在同一目录下,所以直接以运行test.bat文件就能顺利执行。
但是载文解决这个问题呢?
在调用ShellExecute函数之前,是否能够设置一下执行目录呢?
程序中加载了一个DLL文件,但生成的EXE在脱离了DLL文件后仍然可以 单独使用,这是动态加载DLL技术。即:调用资源中的DLL。 此技术的好处:EXE可以使用DLL中的函数,但不会额外增加一 个DLL文件,在使用DLL文件的时候不需要先把DLL释放到硬盘。 在动态加载的这个DLL中定义了一个函数MRun,该函数可以动态执行一 个EXE,即:调用资源中的EXE文件或TMemoryStream中被载入的EXE流。 此技术的好处:直接把资源中的EXE加载到内存中执行,使用程序自 身嵌入的EXE文件的时候不需要先把EXE释放到硬盘上就可以直接执行。 对保密EXE文件很有用。例如:我编写的程序是A.exe,它在运行后需要 使用B.exe,而B.exe是别人编写的我没有源码,但我必须又要在我的程 序中用B.exe,这时我就把它包含到我的A.exe中,这个非常容易做到, 但是,程序A.exe在使用程序B.exe的时候按照常理必须先把B.exe释放 到硬盘上才可以用WinExec或ShellExecute等函数调用它,但你在释放 到硬盘上的时候容易被别人直接复制走,而你只想让别人用你的A.exe不 想让别人直接用B.exe(因为B.exe是别人写的等原因),此时如何保密 B.exe呢?这时只要用到上面所说的MRun函数就可以了,程序A.exe在执 行B.exe的时候不需要释放到硬盘上就可以直接执行B.exe啦,是不是很爽? 说一下MRun的调用方式: MRun(流,参数,进程id); 调用成功返回True,失败返回False,三个参数解释如下: 第一个参数:一个载入了EXE的资源流或者内存流等流类型。 第二个参数:传递调用EXE的参数。如果EXE调用不需要参数,可设置为空串。 第三个参数:如果调用成功,则返回被调用的EXE对应的进程ID。 细节性问题,请直接双击Project1.dpr文件进入演示代码,了解更多。演示代 码中动态加载了MemRun.dll文件,动态调用了5555044.exe文件,如果你想更换 动态调用的EXE文件,只需要用其它EXE覆盖5555044.exe文件并双击Clear.bat 文件后,在Delphi中按F9重新编译运行即可。

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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