如何解决CF_OPERATION_INFO结构中的CF API CF_SYNC_STATUS字段
在Microsoft文档CF_OPERATION_INFO structure中,写得很简短
平台的当前同步状态。
平台在云文件占位符上的任何失败操作时查询此信息。如果一个 结构可用,平台将使用所提供的信息来构建更有意义的 并向用户发送可操作的消息。平台会将这些信息保留在文件中,直到最后一次 处理就消失了。如果为null,则平台将清除先前设置的同步状态(如果有的话)。
在Microsoft CfReportSyncStatus
function 的另一处写着
一旦找到了同步状态,平台将使用所提供的信息为用户构建更有意义和可操作的消息。
我花了很多时间试图从系统中获取此“更有意义,更具实用性的消息”,但没有成功。
在CloudMirror
示例中,我执行以下操作。
评论了try部分,只留下了catch部分,因此我相信我正在模拟传输错误。
void FileCopierWithProgress::CopyFromServerToClient(
_In_ CONST CF_CALLBACK_INFO* lpCallbackInfo,_In_ CONST CF_CALLBACK_PARAMETERS* lpCallbackParameters,_In_ LPCWSTR serverFolder)
{
//try
//{
// CopyFromServerToClientWorker(
// lpCallbackInfo,// lpCallbackInfo->ProcessInfo,// lpCallbackParameters->FetchData.RequiredFileOffset,// lpCallbackParameters->FetchData.RequiredLength,// lpCallbackParameters->FetchData.OptionalFileOffset,// lpCallbackParameters->FetchData.OptionalLength,// lpCallbackParameters->FetchData.Flags,// lpCallbackInfo->PriorityHint,// serverFolder);
//}
//catch (...)
{
TransferData(
lpCallbackInfo->ConnectionKey,lpCallbackInfo->TransferKey,NULL,lpCallbackParameters->FetchData.RequiredFileOffset,lpCallbackParameters->FetchData.RequiredLength,STATUS_UNSUCCESSFUL);
}
}
在TransferData函数中,我创建了CF_SYNC_STATUS结构,并将其地址放在字段opInfo.SyncStatus中, 之后,将调用CfExecute。
LPVOID syncStatus()
{
std::wstring message(L"It is message to sync status");
int lmessage = sizeof(message) + 2 +16;
// round to 16
int extra = lmessage % 16;
lmessage -= extra;
CF_SYNC_STATUS* ss = new CF_SYNC_STATUS{ 0 };
ss->StructSize = sizeof(CF_SYNC_STATUS) + lmessage;
ss->Code = 123;
ss->DescriptionLength = lmessage;
ss->DescriptionOffset = sizeof(CF_SYNC_STATUS);
int size = sizeof(CF_SYNC_STATUS) + 16;
BYTE* buffer = (BYTE*)malloc(size);
memset(buffer,size);
memcpy(buffer,ss,ss->StructSize);
wcscpy((wchar_t*)(buffer + sizeof(CF_SYNC_STATUS)),message.c_str());
return buffer;
}
void FileCopierWithProgress::TransferData(
_In_ CF_CONNECTION_KEY connectionKey,_In_ LARGE_INTEGER transferKey,_In_reads_bytes_opt_(length.QuadPart) LPCVOID transferData,_In_ LARGE_INTEGER startingOffset,_In_ LARGE_INTEGER length,_In_ NTSTATUS completionStatus)
{
CF_OPERATION_INFO opInfo = { 0 };
CF_OPERATION_PARAMETERS opParams = { 0 };
opInfo.StructSize = sizeof(opInfo);
opInfo.Type = CF_OPERATION_TYPE_TRANSFER_DATA;
opInfo.ConnectionKey = connectionKey;
opInfo.TransferKey = transferKey;
opInfo.SyncStatus = (CF_SYNC_STATUS*)syncStatus();
opParams.ParamSize = CF_SIZE_OF_OP_PARAM(TransferData);
opParams.TransferData.CompletionStatus = completionStatus;
opParams.TransferData.Buffer = transferData;
opParams.TransferData.Offset = startingOffset;
opParams.TransferData.Length = length;
winrt::check_hresult(CfExecute(&opInfo,&opParams));
}
当opInfo.SyncStatus字段包含NULL和包含结构的地址时,我看不出有什么区别。
有人知道如何正确使用此功能吗?
谢谢。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。