可以看出,通过上面的几个不同的方法,都可以实现在应用程序中打开其他应用程序的目的,其中有些方法可能会麻烦一点,所以就需要我们根据不同的目的去选择最适合自己的方法去实现自己的目的!
关于三个SDK函数: WinExec, ShellExecute,CreateProcess 的其他注意事项:
1、定义头文件
这个是引用新函数都必须注意的内容。但是MS的头文件引用顺序有点怪,比如上面的三种清理。另外,如果用了预编译,那么记得在任何源程序中的#include “stdafx.h”之前的引用都会失效,从其后才生效。(不可否认,预编译有他的好处,尤其当程序很大的时候,但是任何好处都是要付出代价的)
2、定义路径
C++中所表示的路径要用 " \\ "而不是平常所用的" \ ",所以以上三个函数表示路径都为:
Disk:\\Directory\\...\\File name
WinExec("D:\\Program Files\\Test\\Test.exe",SW_SHOWMAXIMIZED);
ShellExecute(NULL,"open","C:\\Test.txt",NULL,NULL,SW_SHOWNORMAL);
bool fRet=CreateProcess("D:\\putty.exe",NULL,NULL,FALSE,NULL,NULL,NULL,NULL,&si,&pi)
3、注意文件的路径
在程序a调用程序b的时候,b原来的默认的当前路径都会变成a的当前路径。所以,一定要注意。可以养成使用绝对路径的习惯,另外,记得打开文件之类的操作,一定要验证是否有错。
重点说一下第二种方法:
也许你觉得这样制作的程序交流不便,程序文件太多了,万一传递中丢失了什么文件,就会导致整个程序失效。下面介绍一下如何在VC设计的可视化程序里添加代码实现在DOS下运行。当然不是在真正的DOS下运行,但可以在WINming令行里运行。在VC生成的默认项目里,一般都会有一个包含项目名字的APP的类,这个类里有一个函数InitInstance,MFC包装了API函数WinMain,在全局对象实例化后(App a; ),就进入WinMain函数,在里面由MFC这个框架已经写好对InitInstance()的调用,我们进入MFC的源码即可看到),因为该函数是一个虚函数,所以我们实例化继承CWinApp类的App类时,会自动调用App::InitInstance();修改该函数,把DOS的处理代码加入进来,然后RETURN,使其不进入创造可视化窗口函数中。
这里简单举例,我要搞一个读取BMP文件内容并写入别的文件的功能,写好了GUI部分后,我修改InitInstance函数。在其内添加如下内容:
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
if (strlen((char *)m_lpCmdLine) != 0)
{
CFile file;
file.Open(_T("aa.h"), CFile::modeCreate);
file.Close();
if (memcmp((unsigned char *)m_lpCmdLine, (unsigned char *)"-all", 4) == 0)
{
CmdlineOperateAll();
}
else
{
CmdlineOperate((LPSTR)(LPCTSTR)(char *)m_lpCmdLine);
}
return FALSE;
}
这段内容一定要加在
#ifdef _AFXDLL
Enable3dControls(); // Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif
之后。我添加的代码是对ming令行参数做分析,提供不同的操作。
两个操作的函数内容如下
void CmdlineOperate(CString filename)
{
// TODO: Add extra validation here
CString FileName;
CFile File;
BITMAPINFO info;
unsigned char *temp;
BITMAPFILEHEADER file_head;
CString m_ret;
FileName = filename;
if (File.Open(FileName.GetBuffer(_MAX_PATH), CFile::modeRead))
{
File.Read(&file_head, sizeof(BITMAPFILEHEADER));
File.Read(&info.bmiHeader, sizeof(BITMAPINFOHEADER));
long width=info.bmiHeader.biWidth;
long height=info.bmiHeader.biHeight;
CString com;
CTime tm;
CString curtime;
tm=CTime::GetCurrentTime();
curtime=tm.Format("日期:%Y年%m月%d日%x */ \r\n");
com.Format("/* the size is :%dX%d, the char is : %s ; ",
width, height, (File.GetFileName()).Left((File.GetFileName()).GetLength() - 4));
com += curtime;
m_ret += com;
File.Seek(file_head.bfOffBits,CFile::begin);
temp = new unsigned char[(File.GetLength()-file_head.bfOffBits) +1];
File.Read(temp, (File.GetLength()-file_head.bfOffBits));
for (int i = 0, j = 1; i < (int)(File.GetLength()-file_head.bfOffBits); i++, j++)
{
CString str;
str.Format("0X%02X,", temp[i]);
m_ret += str;
printf("0X%02X", temp[i]);
if (j % width == 0)
{
m_ret += _T("\r\n");
printf("\n");
}
}
File.Close();
delete(temp);
}
File.Open(_T("aa.h"), CFile::modeNoTruncate|CFile::modeWrite);
File.SeekToEnd();
File.Write((LPSTR)(LPCTSTR)m_ret,m_ret.GetLength());
File.Flush();
File.Close();
}
void CmdlineOperateAll(void)
{
// TODO: Add extra validation here
WIN32_FIND_DATA fd;
HANDLE hd=::FindFirstFile((LPCTSTR)"*.bmp",&fd); //开始查找
if(hd==INVALID_HANDLE_VALUE)
{
AfxMessageBox("没有找到文件");
return;
}
CmdlineOperate(fd.cFileName);
while(FindNextFile(hd,&fd)) //继续查找
{
CmdlineOperate(fd.cFileName);
}
}
主要是查找文件,内容写入另一个头文件。
本文源自:
翔宇亭——IT乐园(http://www.biye5u.com),转载请保留此信息!
上一页 [1] [2]