用例
我有一个 64 位服务器进程,它通过 IPC (COM+ RPC) 访问 32 位客户端进程的 PID。服务器进程使用父窗口处理程序创建一个新窗口。我需要在客户端窗口中显示新窗口,而不是在桌面窗口顶部显示独立的弹出窗口。
采用的流程
为了在父窗口上显示新窗口,我首先尝试
- 获取顶部窗口的句柄
- 使用 DuplicateHandle 复制窗口句柄
- 使用新的复制窗口句柄创建新窗口
代码
为了复制窗口句柄,我采用了以下代码。请注意,这不是实际代码,而是为简洁起见更改了不相关的部分。另请注意,SetPriviledge 函数是从Enabling and Disabling Privileges in C++中采用的
bool Duplicate(HWND hWnd)
{
HANDLE pToken = NULL;
HANDLE hProcess = NULL;
HANDLE hDuplicateHandle = NULL;
DWORD pid = 0;
bool bReturn = true;
GetWindowThreadProcessId(hWnd, &pid);
if(!(hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid)))
{
std::cout<<"Cannot Open Process:"<<GetLastError()<<std::endl;
bReturn = false;
}
if(bReturn && !OpenProcessToken(
hProcess,
TOKEN_ALL_ACCESS,
&pToken ))
{
std::cout<<"Cannot Open Token:"<<GetLastError()<<std::endl;
bReturn = false;
}
//The SetPriviledge function was adopted from
//http://msdn.microsoft.com/en-us/library/windows/desktop/aa446619(v=vs.85).aspx
if (bReturn && !SetPrivilege(
pToken,
SE_DEBUG_NAME,
true ))
{
std::cout<<"Error Setting Priveledge:error"<<GetLastError()<<std::endl;
bReturn = false;
}
if(bReturn && !DuplicateHandle(
hProcess,
hWnd,
GetCurrentProcess(),
&hDuplicateHandle,
NULL,
NULL,
DUPLICATE_SAME_ACCESS))
{
std::cout<<"Error Duplicating Handle: "<<GetLastError()<<std::endl;
std::cout<<"Source Handle is "<<hWnd<<" And the Duplicate Handle is "<<hDuplicateHandle<<std::endl;
bReturn = false;
}
if (hProcess)
{
CloseHandle(hProcess);
}
return bReturn;
}
来自上述代码的 O/P
Error Duplicating Handle: 6
Source Handle is 00150C1C And the Duplicate Handle is 00000000
Press any key to continue . . .
即代码失败,错误代码 6:ERROR_INVALID_HANDLE
目标
使上述代码工作,以便我可以复制本地进程的远程 Windows 句柄。或者,确定上述过程是否正确。