另外,在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);
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"不对?
为什么不行?把\换成了\\还是不行,为什么?中间加引号的含义是什么?
在 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时,仍然是单步可以,但一步运行,好象是执行了,却没有结果?为什么?执行每条语句的延时是不一样的,我怎么给每条语句加一个延时呢?
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);
}
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
"为什么连续几个不同参数的执行,实际上只做了第一个操作?"
加延时可以Sleep(1000) //1s
#15
重述问题:
不管我用ShellExecute,还是CreateProcess去调用外接程序,我连续执行几条ShellExecute(或CreateProcess)语句,它们带有不同的参数,应该完成不同 的操作,但是它们的执行时间不一样。如果我用F7 单步执行时,每个操作都会完成,但是我用Ctrl+F5,一步执行时,执行的结果表示只完成了第一个ShellExecute(或CreateProcess)语句要求 的操作,这是为什么?
不管我用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)。但是我不知道如何用批处理文件或一个快捷图标来直接使用该软件 ?(如题)目前也没找到相关资料,哪位大哥能说详细点吗?有个例子就更好了!我在哪能查到相关的资料?
小妹先谢过了!
这个软件可以用批处理文件或一个快捷图标来直接使用(By using this software with a "batch file", or a Windows short-cut icon)。但是我不知道如何用批处理文件或一个快捷图标来直接使用该软件 ?(如题)目前也没找到相关资料,哪位大哥能说详细点吗?有个例子就更好了!我在哪能查到相关的资料?
小妹先谢过了!
#21
怕了你了,呵呵!试试
::WinExec(("\"exename\" exeaction"),SW_HIDE);
其实应该都对才是?
::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是否包含目标应用程序(如控制台)的特征字符,找到了就可以得到其句柄,后面就很容易了
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
谢谢了!
谢谢你!用批文件的方法我已解决,但对第二个方法我还不是很懂,你能给我发个例程吗?我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、首先找到所有任务条上的所有应用程序的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);
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"不对?
为什么不行?把\换成了\\还是不行,为什么?中间加引号的含义是什么?
在 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时,仍然是单步可以,但一步运行,好象是执行了,却没有结果?为什么?执行每条语句的延时是不一样的,我怎么给每条语句加一个延时呢?
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);
}
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
"为什么连续几个不同参数的执行,实际上只做了第一个操作?"
加延时可以Sleep(1000) //1s
#15
重述问题:
不管我用ShellExecute,还是CreateProcess去调用外接程序,我连续执行几条ShellExecute(或CreateProcess)语句,它们带有不同的参数,应该完成不同 的操作,但是它们的执行时间不一样。如果我用F7 单步执行时,每个操作都会完成,但是我用Ctrl+F5,一步执行时,执行的结果表示只完成了第一个ShellExecute(或CreateProcess)语句要求 的操作,这是为什么?
不管我用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)。但是我不知道如何用批处理文件或一个快捷图标来直接使用该软件 ?(如题)目前也没找到相关资料,哪位大哥能说详细点吗?有个例子就更好了!我在哪能查到相关的资料?
小妹先谢过了!
这个软件可以用批处理文件或一个快捷图标来直接使用(By using this software with a "batch file", or a Windows short-cut icon)。但是我不知道如何用批处理文件或一个快捷图标来直接使用该软件 ?(如题)目前也没找到相关资料,哪位大哥能说详细点吗?有个例子就更好了!我在哪能查到相关的资料?
小妹先谢过了!
#21
怕了你了,呵呵!试试
::WinExec(("\"exename\" exeaction"),SW_HIDE);
其实应该都对才是?
::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是否包含目标应用程序(如控制台)的特征字符,找到了就可以得到其句柄,后面就很容易了
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
谢谢了!
谢谢你!用批文件的方法我已解决,但对第二个方法我还不是很懂,你能给我发个例程吗?我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、首先找到所有任务条上的所有应用程序的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、如果顺利的话,应该就可以了,如有问题,再联系:)