在VC中直接呼叫系統對話方塊

2021-03-31 08:56:31 字數 1833 閱讀 1532

(這是我第一次發貼,用以前寫的一篇文章,用作測試吧)

昨天我乙個同學問我怎麼在程式中呼叫系統的執行對話方塊,開始覺得應該不難,應該有api函式可用的吧,可是在msdn上找了半天沒找到。後來想想可能是ms沒公開的函式吧,於是上網搜尋一下,看到關於在vb下實現的例子,他是呼叫shell32.dll的乙個沒有公開的函式runfiledlg,不是系統沒有公開的函式。如是就把它改到在vc中實現了!程式設計開始的時候想通過

getprocaddress(hlib, "runfiledlg")
就可以得到這個函式的位址吧!可是跟蹤後發現,得到結果總是null,後來用w32d**看了一下發現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)

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_pre***posed, // 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_pre***posed, // 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)

::freelibrary(hlib);

VC對話方塊程式中直接使用RichEdit需要初始化

在vc中開發mfc對話方塊應用程式時,domodal 返回 1,對話方塊無法顯示,跟蹤後發現domodal 中的createdlgindirect lpdialogtemplate,cwnd fromhandle hwndparent hinst 失敗,上網搜尋一番終於找到了元首 richedit。...

呼叫系統對話方塊示例

演示如何呼叫系統對話方塊 演示語言 delphi uses shlobj,activex 其中 browseinfo.ulflags 引數可選值和含義如下 bif browseforcomputer 只有當使用者 選擇 我的電腦 時 確定 按鈕才有效,計算機可以是網路的 bif browseforp...

VC對話方塊小知識

一 對話方塊屬性 1.styles clip siblings 排除子視窗之間的相對區域,也就是說,當乙個特定的視窗接收到繪圖訊息時,將所有重疊視窗排除在外,只重繪指定的子視窗。styles clip children 當在父視窗內繪圖時,排除子視窗區域。2.more styles system m...