昨天我一個同學問我怎麼在程序中調用系統的運行對話框,開始覺得應該不難,應該有API函數可用的吧,可是在msdn上找了半天沒找到。後來想想可能是MS沒公開的函數吧,於是上網搜索一下,看到關於在VB下實現的例子,他是調用shell32.dll的一個沒有公開的函數RunFileDlg,不是系統沒有公開的函數。如是就把它改到在VC中實現了!編程開始的時候想通過
GetProcAddress(hLib, "RunFileDlg")
就可以得到這個函數的地址吧!可是跟蹤後發現,得到結果總是NULL,後來用W32dsm看了一下發現shell32.dll中沒有這個函數,覺得很是奇怪了。後來發現對於系統中沒有公開的函數不能直接找到地址,而應該這樣調用:
GetProcAddress(hLib, (char *)"61"); //61 是 RunFileDlg 在 Shell32.dll 中導出位置,這樣的話就可以得到函數的地址了!
代碼的實現很簡單,代碼如下:
////////////////////////////////////////////////
//
CString pszDllName="shell32.dll";
HINSTANCE hLib = ::LoadLibrary(pszDllName);
char p[256];
HICON ico;
//這兒我感覺參數應該是LPCWSTR, 但是網上說得是LPCTSTR
typedef void (__stdcall *pRunFileDlg)(HWND,HICON, LPCTSTR, LPCTSTR, LPCTSTR, UINT);
pRunFileDlg RunFileDlg;
if (hLib==NULL)
{
return ;
}
RunFileDlg = (pRunFileDlg)GetProcAddress(hLib, (char *)61);
CString name ="wolfbaby的運行";
CString sss = "輸入程序路徑";
LPWSTR wname=new WCHAR[100];
LPWSTR wsss=new WCHAR[100];
memset(wname,0,sizeof(WCHAR)*100);
memset(wsss,0,sizeof(WCHAR)*100);
MultiByteToWideChar(CP_ACP,
MB_PRECOMPOSED, // character-type options
name, // address of string to map
name.GetLength(), // number of bytes in string
wname, // address of wide-character buffer
100
); //必須先轉換到寬字符,否則後面調用的時候,結果會不對!
MultiByteToWideChar(CP_ACP,
MB_PRECOMPOSED, // character-type options
sss, // address of string to map
sss.GetLength(), // number of bytes in string
wsss, // address of wide-character buffer
100
);
if(RunFileDlg!=NULL)
{
RunFileDlg(this->GetSafeHwnd(),
NULL,
NULL,
(LPCTSTR)wname,
(LPCTSTR)wsss,0x02);
}
::FreeLibrary(hLib);
本文配套源碼