VirtualBox

vbox的更動 60772 路徑 trunk/src/VBox/HostServices


忽略:
時間撮記:
2016-4-29 下午09:16:24 (9 年 以前)
作者:
vboxsync
訊息:

Additions/SharedClipboard: fix for bugref:6466: fixed OpenClipboard() issue when multiple VM started.

檔案:
修改 1 筆資料

圖例:

未更動
新增
刪除
  • trunk/src/VBox/HostServices/SharedClipboard/VBoxClipboard-win.cpp

    r58604 r60772  
    111111#endif /* LOG_ENABLED */
    112112
     113
    113114static void vboxClipboardInitNewAPI(VBOXCLIPBOARDCONTEXT *pCtx)
    114115{
     
    143144}
    144145
     146
     147static int vboxOpenClipboard(HWND hwnd)
     148{
     149    /* "OpenClipboard fails if another window has the clipboard open."
     150    * So try a few times and wait up to 1 second.
     151    */
     152    int rc;
     153
     154    uint32_t u32SleepMS = 1;
     155    int i;
     156    for (i = 0; i <= 9; ++i) /* u32SleepMS = [1..512] */
     157    {
     158        if (OpenClipboard(hwnd))
     159        {
     160            rc = 0;
     161            break;
     162        }
     163        rc = RTErrConvertFromWin32(GetLastError());
     164
     165        RTThreadSleep(u32SleepMS);
     166        u32SleepMS <<= 1;
     167    }
     168#ifdef LOG_ENABLED
     169    if (i > 0)
     170        LogFlow(("vboxOpenClipboard: %d times tried to open clipboard. \n", ++i));
     171#endif
     172    return rc;
     173}
     174
     175
    145176static void vboxClipboardGetData (uint32_t u32Format, const void *pvSrc, uint32_t cbSrc,
    146177                                  void *pvDst, uint32_t cbDst, uint32_t *pcbActualDst)
     
    194225
    195226    /* Query list of available formats and report to host. */
    196     if (OpenClipboard (pCtx->hwnd))
     227    int rc = vboxOpenClipboard(pCtx->hwnd);
     228    if (RT_SUCCESS(rc))
    197229    {
    198230        uint32_t u32Formats = 0;
     
    240272        vboxSvcClipboardReportMsg (pCtx->pClient, VBOX_SHARED_CLIPBOARD_HOST_MSG_FORMATS, u32Formats);
    241273    }
     274    else
     275    {
     276        LogFlow(("vboxClipboardChanged: error in open clipboard. hwnd: %x. err: %Rrc\n", pCtx->hwnd, rc));
     277    }
    242278}
    243279
     
    491527             * windows is to be destroyed and therefore the guest side becomes inactive.
    492528             */
    493             if (OpenClipboard (hwnd))
     529            int res = vboxOpenClipboard(hwnd);
     530            if (RT_SUCCESS(res))
    494531            {
    495532                EmptyClipboard();
    496533
    497534                CloseClipboard();
     535            }
     536            else
     537            {
     538                LogFlow(("vboxClipboardWndProc: WM_RENDERALLFORMATS: error in open clipboard. hwnd: %x, rc: %Rrc\n", hwnd, res));
    498539            }
    499540        } break;
     
    515556            Log(("WM_USER u32Formats = %02X\n", u32Formats));
    516557
    517             if (OpenClipboard (hwnd))
     558            int res = vboxOpenClipboard(hwnd);
     559            if (RT_SUCCESS(res))
    518560            {
    519561                EmptyClipboard();
     
    553595            else
    554596            {
    555                 dprintf(("window proc WM_USER: failed to open clipboard\n"));
     597                dprintf(("window proc WM_USER: failed to open clipboard. rc: %Rrc \n", res));
    556598            }
    557599        } break;
     
    748790     * The guest wants to read data in the given format.
    749791     */
    750     if (OpenClipboard (pClient->pCtx->hwnd))
     792    int rc = vboxOpenClipboard(pClient->pCtx->hwnd);
     793    if (RT_SUCCESS(rc))
    751794    {
    752795        dprintf(("Clipboard opened.\n"));
     
    831874    else
    832875    {
    833         dprintf(("failed to open clipboard\n"));
     876        dprintf(("vboxClipboardReadData: failed to open clipboard, rc: %Rrc \n", rc));
    834877    }
    835878
注意: 瀏覽 TracChangeset 來幫助您使用更動檢視器

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette