您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> VC/MFC >> 用CreateProcess函数调用外部程序打开文件的问题

用CreateProcess函数调用外部程序打开文件的问题

来源:网络整理     时间:2016/8/18 8:03:05     关键词:

关于网友提出的“ 用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

上一篇屏幕锁定和解锁 下一篇保护构造函数

相关图片

相关文章