【问题标题】:pass filename from existing Process to new Process MFC c++将文件名从现有进程传递到新进程 MFC c++
【发布时间】:2015-01-01 07:45:33
【问题描述】:

我试图弄清楚如何将现有可执行文件中的文件名传递给新生成的相同类型的可执行文件,然后新的 exe 加载所述文件名。以下是我正在做的事情,但我真的有点迷路了。

CString cstrExePathLoc;
GetModuleFileName(NULL, cstrExePathLoc.GetBuffer(MAX_PATH), MAX_PATH);
wchar_t szCommandLine[1024] = _T("C:\\Users\\Home\\Desktop\\testfile.tmp");

PROCESS_INFORMATION processInfo;
STARTUPINFO startupInfo;
::ZeroMemory(&startupInfo, sizeof(startupInfo));
startupInfo.cb = sizeof(startupInfo);
CreateProcess(
  cstrExePathLoc, szCommandLine, NULL, NULL, FALSE, CREATE_DEFAULT_ERROR_MODE, NULL, NULL,
  &startupInfo, &processInfo
);

编辑:这仍然没有打开文件。新的 ExeApp 已启动,但未加载任何文件。完全没有产生错误。

我在网上搜索过,但没有找到清楚说明如何执行此操作的示例。任何帮助,将不胜感激。谢谢。

编辑:这里的简单解决方案感谢下面的 Robson Filho Colodeti。

CString cstrExeFilePathAndFilePath2Open = cstrExePathLoc;
cstrExeFilePathAndFilePath2Open += L" \"";
cstrExeFilePathAndFilePath2Open += cstrFilePath2Open;
cstrExeFilePathAndFilePath2Open += L"\"";
CreateProcess(csExePath, cstrExeFilePathAndFilePath2Open.GetBuffer(0), NULL, NULL, TRUE, NULL, NULL, NULL, &sui, &pi);

【问题讨论】:

  • lpCommandLineCreateProcess 参数中传递文件名。在 MFC 应用程序中,您可以使用CWinApp::m_lpCmdLine 成员访问命令行。在控制台应用程序中,它在argc, argv 主要功能参数中可用。
  • 通常你使用 ShellExecute 启动新进程,然后传递你想要的任何命令行参数。
  • 所有这些都可以在一个函数中完成,还是我需要从其他地方调用并发送到其他地方?我会稍微修改一下我的问题,因为将文件路径传递给 lpCommandLine 不会打开文件。
  • @ReturnVoid 你写了读取命令行参数和打开文件的代码吗?

标签: c++ winapi mfc unmanaged


【解决方案1】:

打开其他程序

使用 CreateProcess

你是对的,你可以使用CreateProcess method

BOOL fSuccess;
CString csDir = L"c:\your\working\directory\";
CString csParameters = L"parameter1 parameter2 parameter3 /parameter4=value";
CString csCommand = L"c:\folder\of\the\executable\executable.exe";
csCommand+= L" ";
csCommand+= csParameters;
// Create the child process.
fSuccess = CreateProcess(NULL, csCommand.GetBuffer(0), NULL, NULL, TRUE, 0, NULL,
             csDir, &startupInfo, &processInfo);

使用 ShellExecute

更简单的方法是使用ShellExecute method,因为创建流程方法是一种更“高级”的方式来调用流程,因为它为您提供了很多控制结果等的可能性......

读取其他程序内部的参数

那么您将不得不从其他可执行文件中读取这些参数:check this thread

【讨论】:

  • 谢谢。我会检查一下,看看我的进展如何。
  • 我认为如果您执行类似“c:\folder\executable.exe c:\folder2\filename.extension”的命令,如果另一个应用程序是 MFC 应用程序,我认为 mfc 会自动生成文件打开调用。在另一个应用程序的 InitiInstance 方法中,您会发现类似“CCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo);”的内容这实际上完成了所有工作。因此,如果您只需要打开文件,那么我认为您不必覆盖任何这些内容
  • 在我的程序中 MyApp::InitInstance() 函数包含 ParseCommandLine(cmdInfo);...等等,所以我可以使用 szCommandLine 来传递 *.exe 和文件路径?
  • 是的,你可以使用它,至少我在我的应用程序中这样做 XD 但我想正确的方法应该是使用所有参数 =)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-22
  • 2016-03-31
相关资源
最近更新 更多