VirtualBox

Ignore:
Timestamp:
Apr 29, 2016 9:16:24 PM (9 years ago)
Author:
vboxsync
Message:

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxClipboard.cpp

    r58604 r60772  
    9595}
    9696
     97
     98static int vboxOpenClipboard(HWND hwnd)
     99{
     100    /* "OpenClipboard fails if another window has the clipboard open."
     101    * So try a few times and wait up to 1 second.
     102    */
     103    int rc;
     104
     105    uint32_t u32SleepMS = 1;
     106    int i;
     107    for (i = 0; i <= 9; ++i) /* u32SleepMS = [1..512] */
     108    {
     109        if (OpenClipboard(hwnd))
     110        {
     111            rc = 0;
     112            break;
     113        }
     114        rc = RTErrConvertFromWin32(GetLastError());
     115       
     116        RTThreadSleep(u32SleepMS);
     117        u32SleepMS <<= 1;
     118    }
     119#ifdef LOG_ENABLED
     120    if (i > 0)
     121        LogFlow(("vboxOpenClipboard: %d times tried to open clipboard. \n", ++i));
     122#endif
     123    return rc;
     124}
     125
     126
    97127static int vboxClipboardChanged(PVBOXCLIPBOARDCONTEXT pCtx)
    98128{
     
    100130
    101131    /* Query list of available formats and report to host. */
    102     int rc = VINF_SUCCESS;
    103     if (FALSE == OpenClipboard(pCtx->hwnd))
    104     {
    105         rc = RTErrConvertFromWin32(GetLastError());
    106     }
    107     else
     132    int rc = vboxOpenClipboard(pCtx->hwnd);
     133    if(RT_SUCCESS(rc))
    108134    {
    109135        uint32_t u32Formats = 0;
     
    147173        CloseClipboard();
    148174        rc = VbglR3ClipboardReportFormats(pCtx->u32ClientID, u32Formats);
     175    }
     176    else
     177    {
     178        LogFlow(("vboxClipboardChanged: error in open clipboard. hwnd: %x. err: %Rrc\n", pCtx->hwnd, rc));
    149179    }
    150180    return rc;
     
    472502             * windows is to be destroyed and therefore the guest side becomes inactive.
    473503             */
    474             if (OpenClipboard(hwnd))
     504            int res = vboxOpenClipboard(hwnd);
     505            if (RT_SUCCESS(res))
    475506            {
    476507                EmptyClipboard();
    477508                CloseClipboard();
    478509            }
     510            else
     511            {
     512                LogFlowFunc(("WM_RENDERALLFORMATS: Failed to open clipboard! rc: %Rrc\n", res));
     513            }
    479514        } break;
    480515
     
    483518            /* Announce available formats. Do not insert data, they will be inserted in WM_RENDER*. */
    484519            uint32_t u32Formats = (uint32_t)lParam;
    485 
    486             if (FALSE == OpenClipboard(hwnd))
    487             {
    488                 LogFlowFunc(("WM_USER: Failed to open clipboard! Last error = %ld\n", GetLastError()));
    489             }
    490             else
     520           
     521            int res = vboxOpenClipboard(hwnd);
     522            if(RT_SUCCESS(res))
    491523            {
    492524                EmptyClipboard();
     
    519551                LogFlowFunc(("WM_USER: hClip = %p, err = %ld\n", hClip, GetLastError ()));
    520552            }
     553            else
     554            {
     555                LogFlowFunc(("WM_USER: Failed to open clipboard! error = %Rrc\n", res));
     556            }
    521557        } break;
    522558
     
    527563            HANDLE hClip = NULL;
    528564
    529             if (FALSE == OpenClipboard(hwnd))
    530             {
    531                 LogFlowFunc(("WM_USER: Failed to open clipboard! Last error = %ld\n", GetLastError()));
    532             }
    533             else
     565            int res = vboxOpenClipboard(hwnd);
     566            if (RT_SUCCESS(res))
    534567            {
    535568                int vboxrc;
     
    602635                CloseClipboard();
    603636            }
     637            else
     638            {
     639                LogFlowFunc(("WM_USER: Failed to open clipboard! rc: %Rrc\n", res));
     640            }
    604641
    605642            if (hClip == NULL)
Note: See TracChangeset for help on using the changeset viewer.

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