作为一个例子,让我们看一下EnumWindowStations()
,它需要调用者传递一个EnumWindowStationsProc()
回调函数。当前终端会话中的每个窗口站都会调用一次回调函数。我们看一下回调函数的签名:
BOOL CALLBACK EnumWindowStationProc(
_In_ LPTSTR lpszWindowStation,
_In_ LPARAM lParam
);
第一个参数是指向字符串数据的指针。是否为回调调用显式分配了该字符串缓冲区,是否会在回调返回后立即释放,或者可能在枚举函数返回之前立即释放?或者,指针是否指向某种持久内存,这样字符串缓冲区将在之后保持分配和可用?
这一点很重要,因为如果它不是持久的,那么将原始指针存储在全局容器中以在回调和完整枚举过程完成后访问是不正确的。相反,有必要在回调返回之前将底层字符串数据复制到由应用程序控制的缓冲区。
官方文档似乎没有明确说明字符串数据的生命周期是什么。参数描述中只有一行:
lpszWindowStation [输入]
窗口站的名称。
文档页面上没有任何地方谈论字符串数据的生命周期。我也不记得曾经找到过“一劳永逸”地回答这个问题的 MSDN 页面,即所有使用 Windows API 中的回调习语。
目前我对EnumWindowStations()
/EnumWindowStationsProc()
案例最感兴趣,但最好是回答者解决一般案例,即所有 Windows API 回调函数的假设。