我们使用的许多著名的应用程序,比如VC,WINRAR,SVN等等,都既能在WIN下运行,也支持命令行操作。这是很爽的,习惯在可视化下操作的同志,可以使用GUI界面操作,习惯怀旧或者喜欢命令行操作的同志,可以使用命令操作。同时我们也可以根据不同情况灵活运用,如果你要把硬盘上多于一百个的影视文件分别压缩成压缩包,并加入说明文件,使用可视化操作显示是一件费时费力的工作,但使用命令行写一个简单的批处理循环,就可以轻松完成。这时你会十分感激那些提供操作系统的大佬们,他们在操作系统里集成的一个简单的SHELL的英明的决策使你轻松了多少呀。
这里简单介绍一下如何写一个程序,使我们的程序可以支持跨平台操作,既带命令行,又可以可视操作。
要写一个简单的跨WIN和DOS的程序是很简单的,要是还想能在LIUNX上运行,那可能会复杂一些。
由于对LIUNX知之不多,这里只对制作WIN和DOS程序做一些简单的介绍。制作DOS和WIN下运行的程序,有两种方法。
第一种方法:
先用标准C或者C++写一个DOS程序,然后使用其他可视化编程工具如VC,VB或者DELPHI编写一个界面,然后使用BUTTON通过调用函数WinExec或者ShellExecute或者CreateProcess来执行写的DOS程序。
这里使用转载来的别人的例子来说明如何调用:
三个SDK函数: WinExec,ShellExecute ,CreateProcess可以实现调用其他程序的要求,其中以WinExec最为简单,ShellExecute比WinExec灵活一些,CreateProcess最为复杂。
WinExec 两个参数,前一个指定路径,后一个指定显示方式。
ShellExecute 可以指定工作目录,并且还可以寻找文件的关联直接打开不用加载与文件关联的应用程序,ShellExecute还可以打开网页,启动相应的邮件关联发送邮件等等。
CreateProcess 一共有十个参数,不过大部分都可以用NULL代替,它可以指定进程的安全属性,继承信息,类的优先级等等。如果我们要得到足够多的关于新的进程的信息,控制新的进程的细节属性,若要达到这些目的,我们就需要使用CreateProcess函数了。
三个SDK函数( WinExec、ShellExec、CrateProcess )的语法:
(一)WinExec
这个函数最简单,只有两个参数,原型如下:
UINT WinExec(
LPCSTR lpCmdLine, // 命令路径
UINT uCmdShow // 显示方式
);
使用方法如下:
WinExec("Notepad.exe", SW_SHOW); // 打开记事本
WinExec("D://Program Files//Test//Test.exe",SW_SHOWMAXIMIZED); // 以最大化的方式打开Test.exe
需要注意的是若用 SW_SHOWMAXMIZED 方式去加载一个无最大化按钮的程序,譬如Neterm,Calc 等等,就不会出现正常的 窗体,但是已经被加到任务列表里了。
这个函数只能打开exe文件。
需要的头文件:windows.h,winbase.h(前者是试验出来,后者是msdn上说明),另外,这两者的先后顺序不能变。
msdn上的说明:[url]http://msdn.microsoft.com/en-us/library/ms687393[/url](VS.85).aspx
(二)ShellExecute
原型如下:
HINSTANCE ShellExecute(
HWND hwnd, //父窗口句柄
LPCTSTR lpOperation, //操作, 打开方式 "edit","explore","open","find","print","NULL"
LPCTSTR lpFile, //文件名,前面可加路径
LPCTSTR lpParameters, //参数
LPCTSTR lpDirectory, //默认文件夹
INT nShowCmd //显示方式
);
使用方法如下:
ShellExecute(NULL,"open","C://Test.txt",NULL,NULL,SW_SHOWNORMAL); // 打开C:/Test.txt 文件
ShellExecute(NULL, "open", "[url]http://www.google.com/[/url]", NULL, NULL, SW_SHOWNORMAL); // 打开网页[url]www.google.com[/url]
ShellExecute(NULL,"explore", "D://C++",NULL,NULL,SW_SHOWNORMAL); // 打开目录D:/C++
ShellExecute(NULL,"print","C://Test.txt",NULL,NULL, SW_HIDE); // 打印文件C:/Test.txt
ShellExecute不支持定向输出。
这个函数可以打开任意文件,会调用系统注册的程序来打开对应后缀名的文件。
需要的头文件:windows.h,shellapi.h(前者是我试验出来的,后者是msdn说需要的)。另外这两者的先后顺序不能变。
msdn上说明:[url]http://msdn.microsoft.com/en-us/library/bb762153[/url](VS.85).aspx
(三)CreateProcess
原型如下:
BOOL CreateProcess(
LPCTSTR lpApplicationName, //执行程序名
LPTSTR lpCommandLine, // 参数行
//下面两个参数描述了所创建的进程和线程的安全属性,如果为NULL则使用默认的安全属性
LPSECURITY_ATTRIBUTES lpProcessAttributes, // process security attributes
LPSECURITY_ATTRIBUTES lpThreadAttributes, // thread security attributes
BOOL bInheritHandles, // 继承标志
DWORD dwCreationFlags, // 创建标志
LPVOID lpEnvironment, // 环境变量
LPCTSTR lpCurrentDirectory, // 运行该进程的初始目录
LPSTARTUPINFO lpStartupInfo, // 用于在创建子进程时设置各种属性
LPPROCESS_INFORMATION lpProcessInformation //在进程创建后接受相关信息
);
使用方法如下:
PROCESS_INFORMATION pi;
STARTUPINFO si;
memset(&si,0,sizeof(si));
si.cb=sizeof(si);
si.wShowWindow=SW_SHOW;
si.dwFlags=STARTF_USESHOWWINDOW;
bool fRet=CreateProcess("D://putty.exe",NULL,NULL,FALSE,NULL,NULL,NULL,NULL,&si,&pi);
这个函数可以打开任意文件,会调用系统注册的程序来打开对应后缀名的文件。
需要的头文件:windows.h,winbase.h(前者是试验出来,后者是msdn上说明),另外,这两者的先后顺序不能变。
msdn上的说明:[url]http://msdn.microsoft.com/en-us/library/ms682425[/url](VS.85).aspx
可以看出,通过上面的几个不同的方法,都可以实现在应用程序中打开其他应用程序的目的,其中有些方法可能会麻烦一点,所以就需要我们根据不同的目的去选择最适合自己的方法去实现自己的目的!
关于三个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下运行,但可以在WIN命令行里运行。在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
之后。我添加的代码是对命令行参数做分析,提供不同的操作。
两个操作的函数内容如下
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);
}
}
主要是查找文件,内容写入另一个头文件
<!-- -->
分享到:
相关推荐
Java 编写跨平台应用程序时,需要注意多个方面以确保程序能够在不同的操作系统上正确运行。首先,选择使用标准的 Java Development Kit (JDK) 版本,例如 1.0、1.1、1.2 或更高版本,并且依赖于 Java 核心 API,避免...
编写跨平台程序是软件开发中的一项重要技能,它允许程序在不同操作系统上运行而无需修改源代码。C++作为一种广泛使用的编程语言,加上跨平台框架wxWidgets,可以方便地实现这一目标。wxWidgets,最初名为wxWindows,...
标题中的核心知识点是使用ANSI SQL编写跨平台的数据库应用程序,这意味着在开发过程中,应遵循ANSI SQL-92标准,以确保代码能在不同的数据库管理系统(DBMS)上运行。描述中提到,虽然理论上大多数数据库系统都应该...
由于提供的文件内容中并没有实际的文字信息,无法从中提取知识点,因此我将基于标题“使用CMake构建跨平台应用程序”和描述“论文,讲解的相对细致,共享给大家。比看Ken Martin,Bill Hoffman编著的英文版...
《跨平台应用程序界面框架QT完全手册》是一本深入解析QT框架的专业资料,旨在帮助开发者全面理解和掌握这个强大的跨平台开发工具。QT库以其丰富的功能、高效性能和广泛的平台支持,成为了许多软件开发者首选的界面...
wxWidgets是一个成熟的跨平台C++库,它允许开发者使用一套代码来创建图形用户界面(GUI)程序,这些程序...通过对本书内容的学习,开发者可以掌握wxWidgets编程的基础,有效地利用这个库来简化跨平台应用程序开发过程。
在IT行业中,跨平台命令行界面(CLI)应用程序是开发者常用的一种工具,它们可以在不同的操作系统上运行,如Linux、macOS和Windows。本教程将基于`rust-cli-template`项目,教你如何利用Rust编程语言来编写这样的...
### Java-编写跨平台Java程序注意事项 在Java编程领域中,跨平台性是其核心优势之一,这得益于Java“一次编写,到处运行”的设计理念。然而,在实际开发过程中,要实现真正的跨平台应用并非易事,需要注意诸多细节...
跨平台应用程序设计是现代软件开发领域的一个重要主题,它涉及到如何构建可以在多个操作系统上运行的应用程序,例如iOS、Android、Windows或macOS。本压缩包文件"行业分类-设备装置-跨平台应用程序的设计方法、装置...
关于 ASP 应用程序:解释什么是 ASP 应用程序。 管理应用程序:解释如何启动和停止应用程序并介绍部分应用程序管理服务。 管理会话:解释如何... 编写跨平台应用程序:解释如何在 Macintosh 机上编写能够
《使用wxWidgets进行跨平台程序开发》这本书是程序员们学习如何使用wxWidgets库构建跨平台应用程序的重要资源。wxWidgets是一个开源的C++库,它允许开发者使用标准的C++编写代码,同时能在多个操作系统上运行,包括...
通过学习,你将能够熟练掌握C语言,并具备编写跨平台应用程序的基础。无论是为了进一步学习更高级的编程语言,还是为了在嵌入式开发、系统编程等领域工作,这都是一个不可或缺的学习资源。 在"my_resource"这个...
跨平台开发是软件开发领域中的一个重要方面,它允许开发者使用统一的代码库来构建能在多种操作系统上运行的应用程序,这不仅可以减少开发和维护成本,还能扩大应用的潜在用户基础。 书中首先讨论了Netscape浏览器在...
总的来说,wxWidgets 为开发者提供了一个强大而灵活的工具,用于构建功能丰富的跨平台应用程序。通过不断学习和实践,开发者可以利用 wxWidgets 实现自己的创新想法,同时享受到跨平台开发带来的便利。
《使用wxWidgets进行跨平台程序开发》是一本深入讲解如何利用wxWidgets库构建跨平台应用程序的专业书籍。wxWidgets是一个开源的C++库,它允许开发者使用标准的C++语法编写一次代码,然后在多种操作系统上运行,包括...
在IT行业中,跨平台应用程序的开发是至关重要的,它允许软件在不同的操作系统上运行,如Windows、macOS、Linux等。这种技术极大地扩展了应用程序的用户基础和可用性。"行业分类-设备装置-一种跨平台应用程序的构建...
### C/C++编写跨平台程序的关键知识点 #### 一、跨平台编程的选择与挑战 - **选择C/C++的理由**:C/C++是被广泛支持的编程语言之一,几乎所有操作系统都支持C/C++,这使其成为跨平台编程的理想选择。尽管其他语言...
作为一种动态网页技术,JSP的主要优势在于其强大的功能性和跨平台特性,这使得开发者能够轻松地构建高度交互性的Web应用程序。 #### JSP与传统HTML的区别 在传统的网页开发中,通常使用的格式是*.htm或*.html文件...