程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 如何調用系統對話框

如何調用系統對話框

編輯:關於VC++

昨天我一個同學問我怎麼在程序中調用系統的運行對話框,開始覺得應該不難,應該有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);

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved