OperationStart 函数 (winbase.h)

通知系统应用程序即将启动操作。

如果应用程序使用有效的OPERATION_ID值调用 OperationStart,系统会记录指定操作的文件访问模式,直到为相同的操作 ID 调用 OperationEnd。 此记录存储在 filename.pf 预提取文件中。 每次调用 OperationStart 后都必须调用 OperationEnd,否则操作的记录将在 10 秒后放弃。

如果应用程序调用 OperationStart 以获取存在预提取文件的操作 ID,则系统将在运行操作之前将操作的文件加载到内存中。 录制过程保持不变,并且系统会更新相应的 filename.pf 预提取文件。

语法

BOOL OperationStart(
  [in] OPERATION_START_PARAMETERS *OperationStartParams
);

参数

[in] OperationStartParams

指定 VERSIONOPERATION_IDFLAGS的_OPERATION_START_PARAMETERS结构。

返回值

对于所有有效参数,则为 TRUE,否则为 FALSE。 要获得更多的错误信息,请调用 GetLastError。

注解

_OPERATION_START_PARAMETERS 结构的版本定义为Windows SDK中的OPERATION_API_VERSION。

由于 OperationStart 函数是同步的,因此可能需要几秒钟才能返回。 应避免在 UI 线程中出现这种情况,以获得最佳响应能力。

进程中有操作记录器的单个实例。 尽管操作记录器 API 可以从进程中的多个线程调用,但所有调用都作用于单个实例。

应用程序启动跟踪在进程生存期的前 10 秒内持续。 应在系统结束应用程序启动跟踪后调用 OperationStart

每次调用 OperationStart 后,都必须调用 OperationEnd。 否则,操作跟踪将在大约 10s 后放弃。

可以在给定系统上记录的最大操作数是可配置的。 如果超过此最大值,将替换最近使用最少的预提取文件。

在Windows 8,此功能需要启用 Superfetch 服务。 默认情况下,Windows 8将启用该服务。 对于Windows Server 2012,需要根据需要启用和禁用此预提取功能。 这可以使用基于 CIM 的 PowerShell cmdlet 来完成。 可以使用 CIM_PrefetcherServiceCIM 类公开预提取器功能。

示例

    BOOL Success;
    DWORD ErrorCode;
    OPERATION_START_PARAMETERS OpStart;
    OPERATION_END_PARAMETERS OpEnd;

    // We want to notify Windows that we are going to be performing some          
    // disk-bound work that repeatedly access the same file data. The system will 
    // try to record data about our activity to make future operations faster.    
    
    ZeroMemory(&OpStart, sizeof(OpStart));
    OpStart.Version = OPERATION_API_VERSION;
    OpStart.OperationId = MY_OPERATION_ID_1;

    ZeroMemory(&OpEnd, sizeof(OpEnd));
    OpEnd.Version = OPERATION_API_VERSION;
    OpEnd.OperationId = MY_OPERATION_ID_1;
 
    // We want the system to only record activity in this thread.

    OpStart.Flags = OPERATION_START_TRACE_CURRENT_THREAD;
    OpEnd.Flags = 0;

    Success = OperationStart(&OpStart);

    if (!Success) {
        ErrorCode = GetLastError();
        fprintf(stderr, "OperationStart failed: %d\n", ErrorCode);

        // We could not notify the system about our operation. That's OK.
  
                  }

    // Perform the disk-bound work that should be recorded here.  
    // This may involve opening/reading many files or loading     
    // and running many DLLs.                                    

    Success = OperationEnd(&OpEnd);

    if (!Success) {
        fprintf(stderr, "OperationEnd failed: %d\n", GetLastError());
                  }


要求

要求
最低受支持的客户端 Windows 8 [仅限桌面应用]
最低受支持的服务器 Windows Server 2012 [仅限桌面应用]
目标平台 Windows
标头 winbase.h (包括 Windows.h)
Library Advapi32.lib
DLL Advapi32.dll

另请参阅

OPERATION_ID

操作记录器

OperationEnd

_OPERATION_END_PARAMETERS

_OPERATION_START_PARAMETERS