2

用例

我有一个 64 位服务器进程,它通过 IPC (COM+ RPC) 访问 32 位客户端进程的 PID。服务器进程使用父窗口处理程序创建一个新窗口。我需要在客户端窗口中显示新窗口,而不是在桌面窗口顶部显示独立的弹出窗口。

采用的流程

为了在父窗口上显示新窗口,我首先尝试

  1. 获取顶部窗口的句柄
  2. 使用 DuplicateHandle 复制窗口句柄
  3. 使用新的复制窗口句柄创建新窗口

代码

为了复制窗口句柄,我采用了以下代码。请注意,这不是实际代码,而是为简洁起见更改了不相关的部分。另请注意,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 句柄。或者,确定上述过程是否正确。

4

0 回答 0