ShellExecute函数使用求助

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ShellExecute函数使用求助相关的知识,希望对你有一定的参考价值。

希望能够用ShellExecute函数实现打开一个exe执行程序,然后在这个执行程序中打开另外一个txt文件,求各位大神指教,要详细。
现有的exe文件的功能是将txt文件的文件名(包括扩展名)输入,按enter键即可生成相应的需要的dat文件。希望用ShellExecute实现在调用exe程序时txt文件的文件名(包括扩展名)能够自动读取,不用手动输入。
跪求!!!!!

参考技术A ShellExecute的第三个参数是exe文件名及路径,第四个参数则是命令行参数,你可以把txt文件名及路径放在这里,比如:
ShellExecute Me.hwnd, "Open", "e:\tmp\t1.exe", "e:\tmp\1.txt", App.Path, 0&
这里的e:\tmp\t1.exe是exe文件,e:\tmp\1.txt则是txt文件,你根据自己的实际情况修改即可。

这样,你在那个调用的exe文件中用Command$就可以获取txt文件名及其完整路径了,比如:
Open Command$ For Input As #1追问

试过了不行呀,这是exe打开之后的样子,打开就要输入txt文件路径,怎么让他在打开的时候能够自动获取,不用自己输入

追答

哇,你这是什么古董级软件啊?还是字符界面的。这个exe是你自己的还是别人的(意思就是你有权修改它吗?)?如果能修改,那你就把它改为能够接收命令行参数,然后把命令行参数赋值给文件名变量即可。如果不能修改,那就复杂一些了,如果这个程序支持标准输入输出(一般DOS程序都支持),那么可以试着做个批处理(Bat)文件,把txt文件名通过管道输入导入到exe文件中,比如:
echo myname.txt | 123.exe
然后用ShellExecute调用这个批处理文件即可。

只能说这么多了,你提供的信息有限,我们靠瞎猜也得有个限度吧?

追问

额,我是完全不懂啊,就是给老师完成个任务。那个exe是不能修改的。怎么做批处理啊,就是把echo myname.txt | 123.exe输入到MFC程序里就可以吗。

Visual C++ ShellExecute() 函数中的奇怪行为

【中文标题】Visual C++ ShellExecute() 函数中的奇怪行为【英文标题】:Strange behavior in Visual C++ ShellExecute() function 【发布时间】:2017-02-02 05:46:34 【问题描述】:

我尝试编写一个简短的基于 Visual Studio C++ MFC 对话框的应用程序,但在使用 ShellExecute() 时遇到了一个奇怪的行为。

#include "stdafx.h"
#include <iphlpapi.h>
#include "Shlwapi.h"
#include "TestShellExecute.h"
#include "TestShellExecuteDlg.h"

// CTestShellExecuteApp
BEGIN_MESSAGE_MAP(CTestShellExecuteApp, CWinApp)
    ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
END_MESSAGE_MAP()

// The one and only CTestShellExecuteApp object
CTestShellExecuteApp theApp;

// CTestShellExecuteApp initialization
BOOL CTestShellExecuteApp::InitInstance()

    CWinApp::InitInstance();

    INT_PTR nResponse;
    if (PathFileExists(TEXT("Config.ini")))
        nResponse = IDOK;
    else
    
        CTestShellExecuteDlg dlg;
        m_pMainWnd = &dlg;
        nResponse = dlg.DoModal();
    
    if (nResponse == IDOK)
        ExecuteApp();
    return FALSE;


void CTestShellExecuteApp::ExecuteApp(void)

    ShellExecute(NULL, TEXT("open"), TEXT("notepad"), 
        TEXT("test.txt"), NULL, SW_SHOWNORMAL);
    return;

如果文件“Config.ini”存在,代码直接转到 ShellExecute() 并且记事本可以正常启动。

当“Config.ini”文件不存在时,代码会打开一个只有OK和Cancel的对话框。

按下 OK 后,对话框返回并运行 ShellExecute()。记事本没有启动。如果我注释掉m_pMainWnd = &amp;dlg;这行,那么在对话框返回IDOK后,记事本就会启动。

有人可以解释这种行为吗?

【问题讨论】:

什么是 m_pMainWnd? m_pMainWnd 是主窗口。由于这是一个对话框应用程序,因此对话框是主窗口。此行由 MFC 向导生成。 【参考方案1】:

这似乎只是一个时间问题(如果您设置了m_pMainWnd,则完成了更多清理工作)。如果我在ShellExecute 之后添加Sleep(300);,它就可以工作。您应该记住,ShellExecute 的某些操作可能是异步完成的(例如 DDE)。我会考虑使用SEE_MASK_NOASYNC 切换到ShellExecuteEx 或在终止之前添加Sleep

请不要忘记按照ShellExecute documentation on MSDN 中明确说明的方式初始化 COM。

【讨论】:

在 ShellExecute() 之后放置 Sleep(300) 确实解决了问题。我尝试将 ShellExecuteEx() 与 SEE_MASK_NOASYNC 一起使用,其行为与 ShellExecute() 相同。感谢您的回答。

以上是关于ShellExecute函数使用求助的主要内容,如果未能解决你的问题,请参考以下文章

C语言中ShellExecute函数编译出错

C语言shellexecute函数的用法

C语言shellexecute函数的用法

shellexecute() 函数打开链接文件不起作用,不知道,为啥?

ShellExecute函数

ShellExecute API函数用法简析