Windows API - 剪贴板 - GlobalLock - 使用或不使用?

jav*_*web 2 c++ windows clipboard winapi global-variables

我已经看到练习,如果你要从Windows剪贴板中获取内容,则首先在返回的句柄上调用GetClipboardData()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
Run Code Online (Sandbox Code Playgroud)

arx*_*arx 5

GlobalAlloc 可以返回两个不同的东西,具体取决于它的调用方式.

GlobalAlloc(GMEM_FIXED, n)返回一个指向不动的内存块的指针. GlobalLock是多余的:它将返回相同的值.

GlobalAlloc(GMEM_MOVEABLE, n)返回一个句柄,它不是指向数据的指针.您需要调用GlobalLock将其转换为指针,然后您将获得不同的值.

如果你不知道内存分配的方式是什么GlobalLock.