VC++编程技巧汇总贴

Q: 如何打开一个应用程序?
ShellExecute(this->m_hWnd,"open","calc.exe","","", SW_SHOW );

ShellExecute(this->m_hWnd,"open","notepad.exe",
    "c:\\MyLog.log","",SW_SHOW );
As you can see, I haven't passed the full path of the programs. 
 
Q: 如何打开一个同系统程序相关连的文档?
ShellExecute(this->m_hWnd,"open",
    "c:\\abc.txt","","",SW_SHOW );
 
Q: 如何打开一个网页?
ShellExecute(this->m_hWnd,"open",
    "http://www.google.com","","", SW_SHOW );
 
Q: 如何激活相关程序,发送EMAIL?
ShellExecute(this->m_hWnd,"open",
    "mailto:nishinapp@yahoo.com","","", SW_SHOW );
 
Q: 如何用系统打印机打印文档?
ShellExecute(this->m_hWnd,"print",
    "c:\\abc.txt","","", SW_HIDE);
 
Q: 如何用系统查找功能来查找指定文件?
ShellExecute(m_hWnd,"find","d:\\nish",
    NULL,NULL,SW_SHOW);
 
Q: 如何启动一个程序,直到它运行结束?
SHELLEXECUTEINFO ShExecInfo = {0};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile = "c:\\MyProgram.exe";             
ShExecInfo.lpParameters = "";     
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL;       
ShellExecuteEx(&ShExecInfo);
WaitForSingleObject(ShExecInfo.hProcess,INFINITE);
或:
PROCESS_INFORMATION ProcessInfo; 
STARTUPINFO StartupInfo; //This is an [in] parameter
ZeroMemory(&StartupInfo, sizeof(StartupInfo));
StartupInfo.cb = sizeof StartupInfo ; //Only compulsory field
if(CreateProcess("c:\\winnt\\notepad.exe", NULL, 
    NULL,NULL,FALSE,0,NULL,
    NULL,&StartupInfo,&ProcessInfo))

    WaitForSingleObject(ProcessInfo.hProcess,INFINITE);
    CloseHandle(ProcessInfo.hThread);
    CloseHandle(ProcessInfo.hProcess);
}  
else
{
    MessageBox("The process could not be started...");
}
 
 
Q: 如何显示文件或文件夹的属性?
SHELLEXECUTEINFO ShExecInfo ={0};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_INVOKEIDLIST ;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = "properties";
ShExecInfo.lpFile = "c:\\"; //can be a file as well
ShExecInfo.lpParameters = ""; 
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL; 

ShellExecuteEx(&ShExecInfo);


最近在做网银检测工具,在其中需要检测USBKey管理工具是否安装,如果没有安装的话,需要修复安装,废话不多说,基本的操作流程是:

(1)、把外部EXE程序加入到VC工程资源Resource中,即Resource ->import —>自定义资源名称

 

(2)、在工程名、rc下就会有相应的ocx控件资源列表项.

 

(3)、打开Projecft.rc 中找到

IDR_EXE2   EXE   DISCARDABLE     "res//*.*"

其中IDR_EXE2 是资源的的ID, EXE是定义资源的Type, "res//*.*"是资源的相对路径。

 

(4)、在工程的某些函数处需要调用这些资源时,就要用到下面的windows API函数:

 FindResource()、LoadResource()、SizeofResource() 和LockResource() ,不要忘记最后 FreeResource()哦...

这几个函数的参数原型可以上Google去百度下...只要不是“敏感词”就能sou到...

具体的调用流程就是如此easy:

 

  HINSTANCE  hInst  = NULL;

  HRSRC hResInfo = FindResource(hInst, MAKEINTRESOURCE(资源ID), “资源类型”); //定位我们的自定义资源

 

  DWORD  cbLen= SizeofResource(hInst, hResInfo);  //获得资源的大小 (PS:这步我觉得可有可无)

 

  HGLOBAL hGlobal = LoadResource(hInst, hResInfo);  //加载资源实例..

  

  LPVOID lp= LockResource(hGlobal);   //锁定资源..便于对资源操作...

 

  LockResource()函数返回 LPVOID类型的值,用户可以对资源的返回值自定义例如:

   BYTE *bc; bc = (BYTE *)LockResource(hGlobal);Next 可以对资源对应bc进行操作了

  

 感觉自己废话太多了...这些google上都有..具体到个人的工程中,那就用卡尔.马克思的主义的“具体问题具体分析”了..

 

(5)、在我的工程中,是要将一个安装文件(exe格式)作为一个资源加入到MFC工程中,具体步骤就是前三步,第四步是相应源码中实现的..套用魔术大师--刘谦的口头禅:接下来就是见证奇迹的时刻了..不错,下面就是具体问题具体分析了(估计是高中受政治课的迫害太深):

 

    CString filename = _T("CDYHKEY.exe"); //自定义一个文件名称,用于下面的调用


    HANDLE fp = ::CreateFile(filename,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,0,NULL);  //创建一个临时文件,就在当前目录下(如果最后不想保留这个临时文件的话可以调用 DeleteFile(LPCSTR 文件名称)删除)

 

    DWORD a;  WriteFile(fp,lp,nDataLen,&a,NULL);//向临时文件中写入lp对应的资源数据...

 

     CloseHandle(fp);   //关闭文件句柄  (MS没有这步的话直接ShellExecute 返回值 < 32)  
     FreeResource(hMem);  //释放资源文件

   //接着就可以用ShellExecute()执行filename对应的资源文件了...各参数的含义可以google之...

   int n = (int)ShellExecute(NULL,_T("open"),_T("CDYHKEY.exe"),_T(""),_T(""), SW_SHOW );

   返回值n > 32 则执行成功,否则返回值是什么就找相应的错误代码...

...............相关的操作至此over,



有时候编程会用到一些辅助文件,如果开发时直接在根目录下生成即可。但是完成开发后的可运行程序总不能也直接在当前目录下生成吧?太不美观了,而且烦人,特别是无法在当前目录进行写操作的时候,比如程序是在光盘中。所以将辅助文件放在临时文件夹下。
示例代码:
char tempPath[50];
DWORD dwSize=50;
GetTempPath(dwSize,tempPath);//获取临时文件夹路径

GetTempPath函数声明
 

    DWORDGetTempPath(DWORD nBufferLength,LPTSTR lpBuffer)
参数说明:
nBufferLength:存储路径字符数组申请之内存空间。
lpBuffer:存储路径字符数组地址。
功能:获取临时文件夹路径。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值