我见过一种实践,如果您要通过GetClipboardData()从Windows剪贴板中获取内容,则首先在GlobalLock()返回的句柄上调用GetClipboardData()函数-在检索数据之前(例如,转换并存储)。

但是我发现(至少在C++ 11中)我可以得到相同的数据而无需锁定...

所以有3个子问题...

  • 这怎么可能?
  • 在单线程应用程序中仅运行“单个”安全吗?
  • 在单线程应用程序中同时运行多次是否安全?

  • ...导致一个大问题-什么时候使用或不使用GlobalLock() &&?

    PS:当然,在每个可能的GlobalLock()之后,您应该调用GlobalUnlock()
    这是我检索数据的简单部分:
    HANDLE clipboardHandle;
    string clipboardContents = "";
    clipboardHandle = GetClipboardData( CF_OEMTEXT );
    clipboardContents = (string)static_cast<char*>( clipboardHandle );
    cout << "Clipboard data:" << clipboardContents; //prints out fine
    

    最佳答案

    GlobalAlloc可以根据调用方式返回两个不同的东西。
    GlobalAlloc(GMEM_FIXED, n)返回一个指向不动的内存块的指针。 GlobalLock是多余的:它将返回相同的值。
    GlobalAlloc(GMEM_MOVEABLE, n)返回一个句柄,它不是指向数据的指针。您需要调用GlobalLock将其转换为指针,然后您将获得另一个值。

    如果您不知道分配内存的方式,请致电GlobalLock

    关于c++ - Windows API-剪贴板-GlobalLock-使用还是不使用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27151468/

    10-13 07:49