小编leg*_*mbo的帖子

cfapi CF_CALLBACK_TYPE_FETCH_PLACEHOLDERS 重复回调

我正在使用 cfapi 并尝试扩展此处提供的示例项目https://github.com/Microsoft/Windows-classic-samples/tree/master/Samples/CloudMirror

具体来说,我们希望实现 CF_CALLBACK_TYPE_FETCH_PLACEHOLDERS 以按需提供目录内容。我们的回调是这样注册的:-

CF_CALLBACK_REGISTRATION FakeCloudProvider::s_MirrorCallbackTable[] =
{
    { CF_CALLBACK_TYPE_FETCH_PLACEHOLDERS, FakeCloudProvider::OnFetchPlaceholders },
    { CF_CALLBACK_TYPE_FETCH_DATA, FakeCloudProvider::OnFetchData },
    { CF_CALLBACK_TYPE_CANCEL_FETCH_DATA, FakeCloudProvider::OnCancelFetchData },
    CF_CALLBACK_REGISTRATION_END
};
Run Code Online (Sandbox Code Playgroud)

OnFetchPlaceholders 方法调用 CfExecute() 以使用服务器目录中关联文件的占位符数组来响应回调。

CF_OPERATION_INFO opInfo = { 0 };
CF_OPERATION_PARAMETERS opParams = { 0 };

opInfo.StructSize = sizeof(opInfo);
opInfo.Type = CF_OPERATION_TYPE_TRANSFER_PLACEHOLDERS;
opInfo.ConnectionKey = callbackInfo->ConnectionKey;
opInfo.TransferKey = callbackInfo->TransferKey;

opParams.ParamSize = sizeof(opParams);
opParams.TransferPlaceholders.CompletionStatus = status;
opParams.TransferPlaceholders.Flags = CF_OPERATION_TRANSFER_PLACEHOLDERS_FLAG_NONE;
opParams.TransferPlaceholders.PlaceholderArray = placeholders;
opParams.TransferPlaceholders.PlaceholderCount = placeholdersCount;
opParams.TransferPlaceholders.PlaceholderTotalCount.QuadPart = placeholdersCount;

winrt::check_hresult(CfExecute(&opInfo, &opParams));
Run Code Online (Sandbox Code Playgroud)

出乎意料的是,由于服务器目录中只有三个文件且没有子目录,OnFetchPlacehodlers 函数会被快速连续调用多次(在我刚刚进行的测试中为 457 次),以至于 Explorer 停止响应一段时间。奇怪的是,该方法被调用的次数似乎在 200 …

c++ windows winapi minifilter

3
推荐指数
1
解决办法
799
查看次数

标签 统计

c++ ×1

minifilter ×1

winapi ×1

windows ×1