非常急!!小妹向各位请教关于VC中调用带有参数的可执行应用程序和使用批处理文件的问题!

时间:2021-11-02 18:34:53
我要使用一个软件,它是一个可执行的应用程序,但是要带有参数才能正确执行。这个软件是一个面向命令行的,不支持GUI.但是可以用批处理文件或一个快捷图标来直接使用该软件(By using this software with a "batch file", or a Windows short-cut icon)。但是我不知道如何用批处理文件或一个快捷图标来直接使用该软件 ?
另外,在dos命令行里,我输入了"exename exeaction"(exename是当前目录下的可执行应用程序,exeaction为该程序所带的参数),使用它们,可直接执行exename下exeaction的操作。但在VC中,我用
ShellExecute(NULL , "open","exename exeaction",NULL,NULL,SW_SHOWNORMAL);
为什么没有反应?错在哪里?
大哥,帮帮忙,告诉我该怎么做,小妹现在急需解决这个问题??!!
我的e_mail:little_leaf031@etang.com
我先谢谢各位了!!

24 个解决方案

#1


我来帮你
ShellExecute(NULL , "open","exename","exeaction",NULL,SW_SHOWNORMAL);

#2


ShellExecute(NULL , "open","\"exename\" exeaction",NULL,NULL,SW_SHOWNORMAL);

#3


ShellExecut(NULL , "open","文件名(路径)","参数","文件所在的目录要添”,SW_SHOWNORMAL);

#4


ShellExecute(NULL , "open","\"exename\" exeaction",NULL,NULL,SW_SHOWNORMAL);
为什么不行?把\换成了\\还是不行,为什么?中间加引号的含义是什么?
在 VC中如何表示当前目录下的文件,如新建的工程为prjName,为一个文件夹,在下面含另一文件夹flExe,可执行文件exename在flExe下,如何表示exename路径,为什么用str="\\flExe\\exename"不对?

#5


因为带有不同的参数,就执行不同的操作。我连用了三个ShellExecute语句,它们带有不同的参数。为什么我单步执行的时候可以运行,而直接运行时,为什么不对,实际上未做什么动作。这是为什么呢??

#6


各位,帮帮忙,帮我解决下上面所述问题?
我在线等待!!
谢谢了!

#7


如 96151024() 所说的。不要用str="\\flExe\\exename",试一试str="flExe\\exename"。你运行的是一个控制台程序,单步运行可以看到效果,直接运行应该是有运行了该程序,但看不到效果。

#8


同意楼上

#9


我的工程名为prjName,路径为d:\program\prjName,如上所述,我用以下语句来实现
CString strPath,strFile;
strFile="d:\\program\\prjName"
strPath="flExe\\exeName";
ShellExecute(NULL , "open",strPath,"erase",NULL,SW_SHOWNORMAL);
如96151024() 所说,"文件所在的目录要添”,因此,我又用了
ShellExecute(NULL , "open",strPath,"erase",strFile,SW_SHOWNORMAL);
当我连用了三个带有不同参数的ShellExecute时,仍然是单步可以,但一步运行,好象是执行了,却没有结果?为什么?执行每条语句的延时是不一样的,我怎么给每条语句加一个延时呢?


#10


up

#11


如果你把exename.exe放到了工程目录下,那么在集成环境中运行时候不需要指明路径,可以用以下代码实现带参数的调用:

STARTUPINFO si;
PROCESS_INFORMATION pi;

ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );

BOOL bSuccess =
      CreateProcess(
NULL,
"\"exename\" exeaction", //带参数调用
NULL,                 
NULL,             
FALSE,
CREATE_NEW_CONSOLE,
NULL,
NULL,
&si,
&pi );


if(bSuccess)
{
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
}

#12


为什么连续执行带不同参数的操作,实际上结果 只显示第一个 的执行结果?

#13


楼上所述方法,怎么隐藏控制台程序的执行过程的显示?
为什么连续几个不同参数的执行,实际上只做了第一个操作?

#14


CREATE_NEW_CONSOLE设成NULL,另外没有听太懂:

"为什么连续几个不同参数的执行,实际上只做了第一个操作?"

加延时可以Sleep(1000) //1s





#15


重述问题:
不管我用ShellExecute,还是CreateProcess去调用外接程序,我连续执行几条ShellExecute(或CreateProcess)语句,它们带有不同的参数,应该完成不同 的操作,但是它们的执行时间不一样。如果我用F7 单步执行时,每个操作都会完成,但是我用Ctrl+F5,一步执行时,执行的结果表示只完成了第一个ShellExecute(或CreateProcess)语句要求 的操作,这是为什么?

#16


为什么把CREATE_NEW_CONSOLE设成NULL,仍会显示控制台程序的执行过程?

#17


ShellExecute(NULL , "open","exename","exeaction",NULL,SW_HIDE);

#18


如果用CreateProcess,则怎么隐藏控制台程序的执行过程的显示?

#19


如上所述,如果用CreateProcess,则怎么隐藏控制台程序的执行过程的显示?

#20


还有个相关问题:
这个软件可以用批处理文件或一个快捷图标来直接使用(By using this software with a "batch file", or a Windows short-cut icon)。但是我不知道如何用批处理文件或一个快捷图标来直接使用该软件 ?(如题)目前也没找到相关资料,哪位大哥能说详细点吗?有个例子就更好了!我在哪能查到相关的资料?
小妹先谢过了!

#21


怕了你了,呵呵!试试

::WinExec(("\"exename\" exeaction"),SW_HIDE);

其实应该都对才是?

#22


你看这样行不:
1、首先你可以用程序动态生成一个*.bat文件,如我刚才测试了一下,新建一个
test.bat文件:在其中输入notepad f:\1.txt并保存,然后调用楼上说的:
ShellExecute(NULL , "open","F:\\test.bat","",NULL,SW_HIDE);就可以
用记事本打开1.txt文本,这个我刚才测试了,好用。
2、至于你说用CreateProcess执行,如果上面的方法不好用,你可以试试用这种方法,先执行,然后找出控制台窗口的句柄,然后用PostMessage向其发送WM_CLOSE消息即可,这个我在以前测试过,因为要执行一个java的*.jar文件,为了方便用户执行,想出的这么一个法子,如果你确实要这么做的化,我可以提供相关的实现代码,主要思路是得到当前所有任务条上的应用程序句柄,然后看其Caption是否包含目标应用程序(如控制台)的特征字符,找到了就可以得到其句柄,后面就很容易了

#23


to : chen780831
谢谢你!用批文件的方法我已解决,但对第二个方法我还不是很懂,你能给我发个例程吗?我e_mail:little_leaf031@etang.com
谢谢了!

#24


程序有许多其它的部分,我把主要的部分给你:
1、首先找到所有任务条上的所有应用程序的Caption,和Command Prompt(就是那个黑忽忽的Doc窗口的标志性Caption)
CString strCaption;
CWnd * pDistWnd;
pDistWnd=AfxGetMainWnd()->GetWindow (GW_HWNDFIRST);
while (pDistWnd)
{
     if (pDistWnd ->IsWindowVisible()&& pDistWnd ->GetWindowTextLength ()&&! pDistWnd ->GetOwner ())
{
     pDistWnd ->GetWindowText (strCaption);
     if(strCaption.Find("Command Prompt",0)!=-1)
        break;//说明找到了,你看一下在你的机器上那个Dos窗口的caption
              //是否为Command Prompt
}
pDistWnd=pDistWnd->GetWindow(GW_HWNDNEXT);//Get next window 
}
2、发送消息:
if(pDistWnd!=NULL)
   pDistWnd->PostMessage(WM_CLOSE,NULL,NULL);
3、如果顺利的话,应该就可以了,如有问题,再联系:)

#1


我来帮你
ShellExecute(NULL , "open","exename","exeaction",NULL,SW_SHOWNORMAL);

#2


ShellExecute(NULL , "open","\"exename\" exeaction",NULL,NULL,SW_SHOWNORMAL);

#3


ShellExecut(NULL , "open","文件名(路径)","参数","文件所在的目录要添”,SW_SHOWNORMAL);

#4


ShellExecute(NULL , "open","\"exename\" exeaction",NULL,NULL,SW_SHOWNORMAL);
为什么不行?把\换成了\\还是不行,为什么?中间加引号的含义是什么?
在 VC中如何表示当前目录下的文件,如新建的工程为prjName,为一个文件夹,在下面含另一文件夹flExe,可执行文件exename在flExe下,如何表示exename路径,为什么用str="\\flExe\\exename"不对?

#5


因为带有不同的参数,就执行不同的操作。我连用了三个ShellExecute语句,它们带有不同的参数。为什么我单步执行的时候可以运行,而直接运行时,为什么不对,实际上未做什么动作。这是为什么呢??

#6


各位,帮帮忙,帮我解决下上面所述问题?
我在线等待!!
谢谢了!

#7


如 96151024() 所说的。不要用str="\\flExe\\exename",试一试str="flExe\\exename"。你运行的是一个控制台程序,单步运行可以看到效果,直接运行应该是有运行了该程序,但看不到效果。

#8


同意楼上

#9


我的工程名为prjName,路径为d:\program\prjName,如上所述,我用以下语句来实现
CString strPath,strFile;
strFile="d:\\program\\prjName"
strPath="flExe\\exeName";
ShellExecute(NULL , "open",strPath,"erase",NULL,SW_SHOWNORMAL);
如96151024() 所说,"文件所在的目录要添”,因此,我又用了
ShellExecute(NULL , "open",strPath,"erase",strFile,SW_SHOWNORMAL);
当我连用了三个带有不同参数的ShellExecute时,仍然是单步可以,但一步运行,好象是执行了,却没有结果?为什么?执行每条语句的延时是不一样的,我怎么给每条语句加一个延时呢?


#10


up

#11


如果你把exename.exe放到了工程目录下,那么在集成环境中运行时候不需要指明路径,可以用以下代码实现带参数的调用:

STARTUPINFO si;
PROCESS_INFORMATION pi;

ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );

BOOL bSuccess =
      CreateProcess(
NULL,
"\"exename\" exeaction", //带参数调用
NULL,                 
NULL,             
FALSE,
CREATE_NEW_CONSOLE,
NULL,
NULL,
&si,
&pi );


if(bSuccess)
{
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
}

#12


为什么连续执行带不同参数的操作,实际上结果 只显示第一个 的执行结果?

#13


楼上所述方法,怎么隐藏控制台程序的执行过程的显示?
为什么连续几个不同参数的执行,实际上只做了第一个操作?

#14


CREATE_NEW_CONSOLE设成NULL,另外没有听太懂:

"为什么连续几个不同参数的执行,实际上只做了第一个操作?"

加延时可以Sleep(1000) //1s





#15


重述问题:
不管我用ShellExecute,还是CreateProcess去调用外接程序,我连续执行几条ShellExecute(或CreateProcess)语句,它们带有不同的参数,应该完成不同 的操作,但是它们的执行时间不一样。如果我用F7 单步执行时,每个操作都会完成,但是我用Ctrl+F5,一步执行时,执行的结果表示只完成了第一个ShellExecute(或CreateProcess)语句要求 的操作,这是为什么?

#16


为什么把CREATE_NEW_CONSOLE设成NULL,仍会显示控制台程序的执行过程?

#17


ShellExecute(NULL , "open","exename","exeaction",NULL,SW_HIDE);

#18


如果用CreateProcess,则怎么隐藏控制台程序的执行过程的显示?

#19


如上所述,如果用CreateProcess,则怎么隐藏控制台程序的执行过程的显示?

#20


还有个相关问题:
这个软件可以用批处理文件或一个快捷图标来直接使用(By using this software with a "batch file", or a Windows short-cut icon)。但是我不知道如何用批处理文件或一个快捷图标来直接使用该软件 ?(如题)目前也没找到相关资料,哪位大哥能说详细点吗?有个例子就更好了!我在哪能查到相关的资料?
小妹先谢过了!

#21


怕了你了,呵呵!试试

::WinExec(("\"exename\" exeaction"),SW_HIDE);

其实应该都对才是?

#22


你看这样行不:
1、首先你可以用程序动态生成一个*.bat文件,如我刚才测试了一下,新建一个
test.bat文件:在其中输入notepad f:\1.txt并保存,然后调用楼上说的:
ShellExecute(NULL , "open","F:\\test.bat","",NULL,SW_HIDE);就可以
用记事本打开1.txt文本,这个我刚才测试了,好用。
2、至于你说用CreateProcess执行,如果上面的方法不好用,你可以试试用这种方法,先执行,然后找出控制台窗口的句柄,然后用PostMessage向其发送WM_CLOSE消息即可,这个我在以前测试过,因为要执行一个java的*.jar文件,为了方便用户执行,想出的这么一个法子,如果你确实要这么做的化,我可以提供相关的实现代码,主要思路是得到当前所有任务条上的应用程序句柄,然后看其Caption是否包含目标应用程序(如控制台)的特征字符,找到了就可以得到其句柄,后面就很容易了

#23


to : chen780831
谢谢你!用批文件的方法我已解决,但对第二个方法我还不是很懂,你能给我发个例程吗?我e_mail:little_leaf031@etang.com
谢谢了!

#24


程序有许多其它的部分,我把主要的部分给你:
1、首先找到所有任务条上的所有应用程序的Caption,和Command Prompt(就是那个黑忽忽的Doc窗口的标志性Caption)
CString strCaption;
CWnd * pDistWnd;
pDistWnd=AfxGetMainWnd()->GetWindow (GW_HWNDFIRST);
while (pDistWnd)
{
     if (pDistWnd ->IsWindowVisible()&& pDistWnd ->GetWindowTextLength ()&&! pDistWnd ->GetOwner ())
{
     pDistWnd ->GetWindowText (strCaption);
     if(strCaption.Find("Command Prompt",0)!=-1)
        break;//说明找到了,你看一下在你的机器上那个Dos窗口的caption
              //是否为Command Prompt
}
pDistWnd=pDistWnd->GetWindow(GW_HWNDNEXT);//Get next window 
}
2、发送消息:
if(pDistWnd!=NULL)
   pDistWnd->PostMessage(WM_CLOSE,NULL,NULL);
3、如果顺利的话,应该就可以了,如有问题,再联系:)