您的位置:首页 > 其它

在对话框应用中嵌入一个.exe应用

2015-03-27 18:36 92 查看
注:本文系由外文翻译而来,原文请见Hosting .exe applications into a dialog

一篇关于在基于对话框应用中启动和嵌入.exe应用的文章

例程下载-27.0KB



介绍

这是个讲述如何嵌入一个.exe应用到对话框中去的简单应用。相同的应用可以在C#中使用,点击这里。但是如果我们想在VC++ 6.0实现这个目的,就有一点点的不一样。我试图在不同网站中找到VC++ 6.0下相关的例子,但却没有找到,最终我决定自己来完成这项工作。

过程

基本的步骤如下:

1. 声明两个需要的变量

2. 用CreateProcess启动需要打开的.exe应用

3. 写一个回调函数来获得处理窗口的句柄HWND

4. 给.exe应用设置父窗口

5. 设置.exe应用窗口的位置

具体实现

步骤1:声明两个变量

你必须先声明以下变量:

HWND apphwnd;
HANDLE handle;


步骤2:用CreateProcess函数启动.exe应用

下面这个函数将会完成这个任务,并返回进程的句柄

HANDLE StartNewProcess(LPCTSTR program, LPCTSTR args)
{
HANDLE hProcess = NULL;
PROCESS_INFORMATION processInfo;
STARTUPINFO startupInfo;
::ZeroMemory(&startupInfo, sizeof(startupInfo));
startupInfo.cb = sizeof(startupInfo);
if(::CreateProcess(program, (LPTSTR)args,
NULL,  // process security
NULL,  // thread security
FALSE, // no inheritance
0,     // no startup flags
NULL,  // no special environment
NULL,  // default startup directory
&startupInfo,
&processInfo))
{ /* success */
Sleep(5000);//wait for the window of exe application created
::EnumWindows(&EnumWindowsProc, processInfo.dwThreadId);
hProcess = processInfo.hProcess;
} /* success */
return hProcess;//Return HANDLE of process.
}


这里我们用CreateProcess启动进程。

函数WaitForInputIdle将暂停一个线程的执行,直到相应的进程完成初始化工作。通过把句柄传递给每个窗口,并反过来给到一个用户定义的回调函数中去,函数EnumWindows枚举屏幕上所有顶层窗口。EnumWindows函数一直运行直到最后一个顶层窗口被列举出来,或者回调函数返回FALSE。

我们的回调函数将会获取新进程窗口的句柄HWND。返回的句柄hprocess能被用来终止进程。

TerminateProcess(handle,0);


步骤3:写一个回调函数来获取进程窗口的句柄HWND

为了找到我们的.exe应用窗口的句柄HWND,本步骤很重要。我们可以把这个窗口句柄用到不同的函数中去,如SetParent,MoveWindow等。

int CALLBACK EnumWindowsProc(HWND hwnd, LPARAM param)
{
DWORD pID;
DWORD TpID = GetWindowThreadProcessId(hwnd, &pID);
if (TpID == (DWORD)param)
{
apphwnd=hwnd;
return false;
}
return true;
}


函数GetWindowThreadProcessId检索创建了特定窗口线程的id。apphwnd变量保存了新建窗口的句柄。

步骤4:为.exe应用设置父窗口

此时我们设置.exe应用窗口的父窗口。父窗口是我们的对话框应用窗口。

::SetParent(apphwnd,m_hWnd);


如果有必要,我们可以利用下面这个函数移除.exe窗口的标题栏。

::SetWindowLong(apphwnd, GWL_STYLE, WS_VISIBLE);


步骤5:设置.exe窗口位置

这个可以用下面的代码实现:

CRect rect;
GetClientRect(&rect);
::MoveWindow(apphwnd, rect.left, rect.top,rect.right, rect.bottom, true);


GetClientRect函数将会获得我们对话框窗口的大小尺寸。MoveWindow函数将会把.exe应用窗口移到我们的对话框中去。

备注

注意到调用函数StarNewProcess后,我们只能进行步骤4和5操作,并且应该在对话框项目中完成。

历史

2007年5月9日——原始版本发布

许可声明

这篇文章及相关源码和文件在协议CPOL许可之下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐