gpt4 book ai didi

c++ - Windows API - 剪贴板 - GlobalLock - 使用还是不使用?

转载 作者:可可西里 更新时间:2023-11-01 09:53:09 27 4
gpt4 key购买 nike

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

但是我发现(至少在 C++11 中)我可以在没有锁定的情况下获得相同的数据...

所以有3个子问题...

  1. 这怎么可能?
  2. 单线程应用仅“单”运行安全吗?
  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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com