关于网友提出的“ 用CreateProcess函数调用外部程序打开文件的问题”问题疑问,本网通过在网上对“ 用CreateProcess函数调用外部程序打开文件的问题”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: 用CreateProcess函数调用外部程序打开文件的问题
描述: 做了个界面,
用GetPathName()函数得到了选中文件的绝对路径,其值保存在CString strPath里。
若主程序程序、外部执行程序、要打开的文件在同一目录下时,CreateProcess的第二个参数只需用“ffplay 文件名”调用外部程序ffplay.exe打开文件。
现在我要用CreateProcess函数调用外部程序ffplay.exe打开任意目录下选中的媒体文件。
不知怎么回事,选中文件后并没有按预期的那样ffplay.exe开始播放选中的文件。
如果不用CreateProcess函数,而改用ShellExecute函数时是可以实现上面的功能的(说明得到的strPath的值是正确的文件路径,而且命令行也没有错误)。
现在因为要实现其它的功能所以最好要使用CreateProcess函数来调用外部程序ffplay.exe打开文件。
请问应该如何修改才对呢?望各位高手指教·~
以下是代码:
void CPlayer2Dlg::OnButtonOpen()
{
// 下面这段是获得了选中文件的绝对路径
CString strPath;
CFileDialog Open(TRUE,"*.dat;*.avi;*.mpg;*.3gp",
NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
"影像文件 (*.dat;*.avi;*.mpg;*.3gp) |*.dat;*.avi;*.mpg;*.3gp |All Files (*.*) |*.* | |",NULL);
if(Open.DoModal() == IDOK)
{
strPath = Open.GetPathName();
}
//下面这段是用CreateProcess函数实现调用ffplay.exe成功打开刚才选中的文件
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi,sizeof(pi));
TCHAR szAppName[_MAX_PATH] = TEXT( "ffplay.exe");
TCHAR szCmdLine[_MAX_PATH] = TEXT("ffplay ");
_tcscat(szCmdLine,strPath);
if(!CreateProcess(szAppName,
szCmdLine,
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
&si,
&pi )
)
{
//ErrorExit("CreateProcess failed.");
}
WaitForSingleObject(pi.hProcess,INFINITE);
}
解决方案1:设断点后执行到“DWORD dw = ::GetLastError();”这一行时,dw的value值是3435973836
断点设这里,这行代码还没执行呢,也就是说dw还没赋值, 3435973836 = 0xCCCCCCCC,这是调试器给dw赋的初值,不是GetLastError的返回值.
if(!CreateProcess(szAppName,
szCmdLine,
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
&si,
&pi )
)
{
DWORD dw = ::GetLastError();
int i = 0; //把断点设这里,再看dw的值。
}
另外有一个疑点,
TCHAR szAppName[_MAX_PATH] = TEXT( "ffplay.exe");
TCHAR szCmdLine[_MAX_PATH] = TEXT("ffplay ");
_tcscat(szCmdLine,strPath); //不知道这个strPath里有没有空格啊?有空格的话一定会有问题。因为会被当成多个参数.
为了保证有空格也能正常, 应当给strPath里的字符串加上双引号.
TCHAR szAppName[_MAX_PATH] = TEXT( "ffplay.exe");
TCHAR szCmdLine[_MAX_PATH] = TEXT("ffplay ");
_tcscat(szCmdLine,TEXT("\""));
_tcscat(szCmdLine,strPath); //不知道这个strPath里有没有空格啊?有空格的话一定会有问题。
_tcscat(szCmdLine,TEXT("\""));
解决方案2: if(!CreateProcess(szAppName,
szCmdLine,
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
&si,
&pi )
)
{
DWORD dw = ::GetLastError();
}
看看dw是什么错误
解决方案3: 场景假设:ffplay.exe在c:\test, ffplay在e:\media
那么,最好是拼一个字符串:char* szCmd = "c:\\test\\ffplay.exe e:\\media\\ffplay"
然后调用CreateProcess(NULL, szCmd, ......)
以上介绍了“ 用CreateProcess函数调用外部程序打开文件的问题”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/3363049.html