CDHtmlDialog、UpdateResource、ShellExecute用法简记。  
  
  


C++封装exe

目标:一个网页,想以exe呈现。
法一:使用webbrowser控件
工具箱右键Group Box,[选择项]-[COM组件]-[Microsoft Web Browser]。
初始化中,

1
m_webbrowser.Navigate(_T("file:///D:/test.htm"),NULL,NULL,NULL,NULL);

法二:新建MFC,勾选html对话框。(实质是内嵌了一个webbrowser控件)
初始化中,

1
Navigate(_T("www.hubojing.me"));

MFC编译后会自动生成exe文件。

1
2
3
4
5
6
7
8
    void Navigate(
LPCTSTR lpszURL,
DWORD dwFlags = 0,
LPCTSTR lpszTargetFrameName = NULL,
LPCTSTR lpszHeaders = NULL,
LPVOID lpvPostData = NULL,
DWORD dwPostDataLen = 0
);

详见https://msdn.microsoft.com/zh-cn/library/fyhfs9yd.aspx

CDHtmlDialog

html对话框继承了CDHtmlDialog,和CDialog不同之处是包含了一个HTML资源。
如何在CDHtmlDialog中引用html资源的方法

UpdateResource用法

1
2
3
4
5
6
7
8
BOOL WINAPI UpdateResource(
_In_ HANDLE hUpdate,
_In_ LPCTSTR lpType,
_In_ LPCTSTR lpName,
_In_ WORD wLanguage,
_In_opt_ LPVOID lpData,
_In_ DWORD cbData
);

参数一的句柄利用 BeginUpdateResource 来获得。
参数二 资源类型 详见https://msdn.microsoft.com/en-us/library/windows/desktop/ms648009(v=vs.85).aspx
eg.html为RT_HTML,对话框为RT_DIALOG。
参数三是要插入的资源的资源ID,常用MAKEINTRESOURCE(ID)形式。注意在使用前#define IDC_XXXX_XXXX 105定义(要和资源本身ID号相同),否则报错。
参数四是一个指向资源指针,注意只能是Unicode格式。
参数五是资源的大小size。

官方例子:
https://msdn.microsoft.com/en-us/library/windows/desktop/ms648008(v=vs.85).aspx#_win32_Updating_Resources
eg.该版比2008版msdn有小更改,现在的更清晰明了。

Updating Resources
目标:将Hand.exe中的dialog box资源插入到Foot.exe。
过程:
1.使用LoadLibrary函数加载Hand.exe。
2.使用FindResource和LoadResource函数定位和加载dialog box资源。
3.使用LockResource函数获得一个指向dialog box资源的指针。
4.使用BeginUpdateResource函数打开一个Foot.exe的更新句柄。
5.使用UpdateResource函数从Hand.exe复制dialog box资源到Foot.exe。
6.使用EndUpdateResource函数来完成更新。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
HGLOBAL hResLoad;   // handle to loaded resource
HMODULE hExe; // handle to existing .EXE file
HRSRC hRes; // handle/ptr. to res. info. in hExe
HANDLE hUpdateRes; // update resource handle
LPVOID lpResLock; // pointer to resource data
BOOL result;
#define IDD_HAND_ABOUTBOX 103
#define IDD_FOOT_ABOUTBOX 110

// Load the .EXE file that contains the dialog box you want to copy.
hExe = LoadLibrary(TEXT("hand.exe"));
if (hExe == NULL)
{
ErrorHandler(TEXT("Could not load exe."));
return;
}

// Locate the dialog box resource in the .EXE file.
hRes = FindResource(hExe, MAKEINTRESOURCE(IDD_HAND_ABOUTBOX), RT_DIALOG);
if (hRes == NULL)
{
ErrorHandler(TEXT("Could not locate dialog box."));
return;
}

// Load the dialog box into global memory.
hResLoad = LoadResource(hExe, hRes);
if (hResLoad == NULL)
{
ErrorHandler(TEXT("Could not load dialog box."));
return;
}

// Lock the dialog box into global memory.
lpResLock = LockResource(hResLoad);
if (lpResLock == NULL)
{
ErrorHandler(TEXT("Could not lock dialog box."));
return;
}

// Open the file to which you want to add the dialog box resource.
hUpdateRes = BeginUpdateResource(TEXT("foot.exe"), FALSE);
if (hUpdateRes == NULL)
{
ErrorHandler(TEXT("Could not open file for writing."));
return;
}

// Add the dialog box resource to the update list.
result = UpdateResource(hUpdateRes, // update resource handle
RT_DIALOG, // change dialog box resource
MAKEINTRESOURCE(IDD_FOOT_ABOUTBOX), // dialog box id
MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), // neutral language
lpResLock, // ptr to resource info
SizeofResource(hExe, hRes)); // size of resource info

if (result == FALSE)
{
ErrorHandler(TEXT("Could not add resource."));
return;
}

// Write changes to FOOT.EXE and then close it.
if (!EndUpdateResource(hUpdateRes, FALSE))
{
ErrorHandler(TEXT("Could not write changes to file."));
return;
}

// Clean up.
if (!FreeLibrary(hExe))
{
ErrorHandler(TEXT("Could not free executable."));
return;
}

ShellExecute用法

1
2
3
4
5
6
7
8
ShellExecute(
HWND hwnd, //父窗口句柄
LPCSTR lpOperation, //操作类型
LPCSTR lpFile, //要进行操作的文件或路径
LPCSTR lpParameters, //当lpOperation为“explore”时指定要传递的参数,通常设为NULL
LPCSTR lpDirectory, //指定默认目录,通常设为NULL
INT nShowCmd //文件打开的方式,以通常方式还是最大化或最小化显示
)

eg:
ShellExecute(NULL,”open”,”calc.exe”,NULL,NULL,SW_SHOWNORMAL);//调用计算器
ShellExecute(NULL,”open”,”NOTEPAD.EXE”,NULL,NULL,SW_SHOWNORMAL);//调用记事本

详见https://msdn.microsoft.com/en-us/library/windows/desktop/bb762153(v=vs.85).aspx