我正在使用 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 …