_splitpath,_wmakepath,GetModuleFileName,GetModuleHandle,CCommandLineInfo等用法

函数一:_splitpath 分解路径

函数原型:
void _splitpath( const char *path, char *drive, char *dir, char *fname, char *ext);
参数:

  1. path,完成的文件绝对路径;加入一个const证明是一个输入参数,不可以修改。
  2. drive:磁盘的字符串,比如 C
  3. dir:中间路径的字符串
  4. fname:文件名称
  5. 文件的后缀名
    如果不关注某个参数(绝对路径除外),就在相应位置填 NULL
    比如:D:\Program Files\Config\BPMNTagActionTool.xml
    char path[_MAX_PATH], drive[_MAX_PATH], dir[_MAX_PATH], fname[_MAX_PATH], ext[_MAX_PATH];
    path = ;
    _splitpath();
    例子:创建一个Win32 console 文件,带简单例子:
// dfgf.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

int main(int argc, char* argv[])
{
	char path[_MAX_PATH] ,drive[_MAX_PATH], dir[_MAX_PATH], fname[_MAX_PATH], ext[_MAX_PATH];
	strcpy(path,"D:\\Program Files\\Config\\BPMNTagActionTool.xml");
	_splitpath(path,drive,dir,fname,ext);
	printf("drive: %s\n",drive);
	printf("dir: %s\n",dir);
	printf("fname: %s\n",fname);
	printf("ext: %s\n",ext);
	return 0;
}

输出为:

drive: D
dir:  \Program Files\Config\
fname:BPMNTagActionTool
ext:  .xml

【注意】\转义字符 这个是C程序 用双斜杠才可以,路径表示方法与C++有点不太一样。否则会出现解析路径失败的问题。
【引申问题】如何将字符串赋值给字符数组
[方法一] 初始化的时候直接赋值
char path[_MAX_PATH] = “D:\Program Files\Config\BPMNTagActionTool.xml”,drive[_MAX_PATH], dir[_MAX_PATH], fname[_MAX_PATH], ext[_MAX_PATH]; //初始化时 =不是赋值运算
**[方法二]**一个字符一个字符的赋值,
char a[6] = {‘h’,‘e’,‘l’,‘l’,‘o’};
[方法三] 利用strcpy函数
strcpy(path,“hello”);//此处用hello字符串 示意一下 上面的绝对路径(太长)
不过得添加头文件 #include “string.h”
【引申问题】strcpu()函数原型为
char *strcpy(
char *strDestination,
const char *strSource
);
char * __cdecl strcpy(char *, const char *);//一个标准C函数
第一个参数 为 赋值参数,目标参数 strDestination;
第二个参数为 输入参数,源参数 strSource
函数返回值类型为char *,返回的是strDestination,其实返回的结果与源参数也是一样子哒,毕竟是copy函数嘛。

函数二:_wmakepath 合成路径

功能 :合成路径 ,,,参数如上面一个函数的,只不过 只有path可以修改,其他参数不可以修改。注意与上式的区别。
void _wmakepath(
wchar_t *path,
const wchar_t *drive,
const wchar_t *dir,
const wchar_t *fname,
const wchar_t *ext
);

函数三:GetModuleFileName:获取执行程序的绝对路径

函数原型:
需要添加头文件:#include"windows.h"

DWORD GetModuleFileNameA(
  HMODULE hModule,//可执行程序或者DLL的实力句柄,为NULL时可执行程序的路径名
  LPSTR   lpFilename,//接收路径的字符串缓冲区//如果为CString,则要调用GetBuffer转换数据类型
  DWORD   nSize//接收路径的字符串缓冲区大小
);
//返回值:return nSize 缓冲区字符串的大小

实例程序:

    CString strPath;
	char drive[_MAX_DRIVE];
	char dir[_MAX_DIR];
	char fname[_MAX_FNAME];
    char ext[_MAX_EXT];
	char mstrpath[_MAX_PATH];

	::GetModuleFileName(NULL,strPath.GetBuffer(_MAX_PATH+1),_MAX_PATH+1);//注意此处//获取程序绝对路径
	strPath.ReleaseBuffer();
	_splitpath(strPath,drive,dir,fname,ext);//分解路径
	CString str;
	str.Format("%s--%s--%s--%s",drive,dir,fname,ext);
	AfxMessageBox(str);//E--\C++Program\dgdfh\Debug\--dgdfh--.exe
	_makepath(mstrpath,drive,dir,fname,ext);//合成路径
	AfxMessageBox(mstrpath);//E:\C++Program\dgdfh\Debug\dgdfh.exe

函数四:GetModuleHandle

函数原型:

HMODULE GetModuleHandleA(
  LPCSTR lpModuleName//模块名字可以是.exe,也可以是.dll,此参数为NULL时,默认为.dll
);
//路径必须为\ 
//返回值为:特定模块的句柄
//注意:该函数不会增加木块的引用计数,无论调用多少次都只调用一次FreeLibrary(),
//该模板就在进程中卸载了。在不同线程中调用该函数不一定一直都有效,在获得模板句柄
//后,另一个线程将该句柄释放了,获得了其他模板的句柄,当再次使用该句柄时就不是一
//开始时获得了句柄了。【此段摘抄,不太懂】

函数五:GetModuleHandleEx

GetModuleHandleEx (dwFlags, lpModuleName, phModule);
dwFlags:
如果是0,则当调用该函数时,模块的引用计数自动增加,调用者在使用完模块句柄后,必须调用一次FreeLibrary
如果是GET_MODULE_HANDLE_EX_FLAG_PIN,则模块一直映射在调用该函数的进程中,直到该进程结束,不管调用多少次FreeLibrary
如果是GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,则同GetModuleHandle相同,不增加引用计数
如果是GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,则lpModuleName是模块中的一个地址
phModule存储要找的句柄。其他都和GetModuleHandle函数相同

函数六:CCommandLineInfo

功能:辅助在应用程序启动时分析命令行,这是一个类
class CCommandLineInfo : public CObject
所需头文件:#include <afxwin.h>

MFC 应用程序通常将创建此类中的本地实例InitInstance其应用程序对象的函数。 然后将此对象传递给CWinApp::ParseCommandLine,从而会反复调用ParseParam填充CCommandLineInfo对象。 CCommandLineInfo对象然后传递给CWinApp::ProcessShellCommand处理命令行参数和标志。
要处理其它的选项,可以从类CCommandLineInfo派生一个子类,然后覆盖函数ParseParam进行相应的处理。

参考
1.https://blog.csdn.net/milanleon/article/details/18077911
2.http://www.cnblogs.com/braver/articles/2569837.html
3.https://blog.csdn.net/Gordennizaicunzai/article/details/79464336 示例

猜你喜欢

转载自blog.csdn.net/u012719076/article/details/83515047