C++用ShellExecute传递参数的问题

Posted

tags:

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

假设有int型变量a,b,c,d,需要通过ShellExecute函数传递给一个可执行程序project.exe,那这个ShellExecute语句该怎么写?
主要是变量从int型和LPCSTR的类型转换

参考技术A char buf[100];
sprintf(buf, "%d %d %d %d", a, b, c, d);
ShellExecute(NULL, TEXT("open"), TEXT("c:\\windows\\project"), (LPCTSTR)buf, NULL,SW_SHOW);追问

谢谢。能不能再问个问题:为什么我使用传递的参数时,argv[0]指向的是0,argv[1]才指向参数a呢?

本回答被提问者和网友采纳
参考技术B

通过 atoi 等函数可实现转换。

#include <cstringt.h>  

...

CString sNumber= "1234567890";

int     nResult;


nResult= atoi( sNumber );  // automatically does LPCSTR(sNumber)

参考技术C http://zhidao.baidu.com/question/39024655.html

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() 相同。感谢您的回答。

以上是关于C++用ShellExecute传递参数的问题的主要内容,如果未能解决你的问题,请参考以下文章

shellexecute或winexec处理批处理文件时,批处理文件有外界的参数输入该怎么处理

C++:尝试将 fstream 作为参数传递时删除了函数?

c++中如何用函数传递fstream类型

C++ 编写一个WIN32程序,向CMD传递参数

C++函数如何传递字符串

如何用c#调用c++的dll传递各种稀奇古怪的参数。