1. 程式人生 > >_splitpath,_wmakepath,GetModuleFileName,GetModuleHandle,CCommandLineInfo等用法

_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 示例