我需要哪些 DLL 和库才能使用 `timeBeginPeriod` 或 `timeapi.h` 的其他部分?

What DLLs and libs do I need so I can use `timeBeginPeriod` or other parts of `timeapi.h`?

而许多 Windows API 函数存在于 Windowsapp.lib 或 API 集中(参见 this answer to How to declare and link to RoInitialize,RoUninitialize,RoGetActivationFactory and HSTRING Functions in Mingw Gcc), many functions are not listed as included in WindowsApp.lib or in the extension APIs.

例如timeBeginPeriod,我想用它来设置Sleep的分辨率。

它是 Timeapi 的一部分,WindowsApp.lib 或扩展 API 中的可用函数列表中的任何地方都没有提到它。该文档也没有提及任何 API 集。

我怎么知道? RoInitialize 没有提到 DLL 或 API 集,但它有多种形式。

我想我会自己调查一下。自己写了一个小测试程序,用VS编译器测试了一下。

  1. 通过“开始”,我启动了 VS 开发人员提示符 (among other ways of doing that like in the answer to Run cl.exe from cmd)。
  2. 我写了一些简单的程序来测试各种情况。

答案

我的实验表明这个问题的答案不一定是直截了当的:

  • Do I link to winmm.lib and winmm.dll?

你可以 link/consume winmm,但 windowsapp.lib 也足够了,尽管没有记录时间 API 函数是其中的一部分。

  • Do I include Windows.h or timeapi.h?

至少在我的实验中,Windows.h实际上需要使用timeBeginPeriodtimeapi.h 是不够的或必要的。我不清楚为什么会这样。


我是这样得到这个答案的:

编译一个简单的程序

只是为了证明事情会编译:

#include <iostream>
int main()
{
    std::cout << "Hello!" << std::endl;
}
>cl /EHsc src\app.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 19.28.29336 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

app.cpp
Microsoft (R) Incremental Linker Version 14.28.29336.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:app.exe
app.obj


> .\app.exe
Hello!

使用已知存在于 Windowsapp.lib

中的函数
#include <iostream>
#include <winstring.h>

int main()
{
    std::cout << "Hello!" << std::endl;

    // Ignore the poor error handling
    HSTRING string;
    WindowsCreateString(L"Test", 4, &string);
    const auto len = WindowsGetStringLen(string);
    std::cout << len << std::endl;
    WindowsDeleteString(string);
}
> cl /EHsc windowsapp.lib src\app.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 19.28.29336 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

app.cpp
Microsoft (R) Incremental Linker Version 14.28.29336.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:app.exe
windowsapp.lib
app.obj

> .\app.exe
Hello!
4

消费函数时间API函数(本题)

#include <iostream>
// Interestingly, timeapi.h does not work:
// #include <timeapi.h>
#include <Windows.h>

int main()
{
    std::cout << "Hello!" << std::endl;
    timeBeginPeriod(500);
}

正在链接 winmm.lib:

> cl /EHsc winmm.lib src\app.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 19.28.29336 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

app.cpp
Microsoft (R) Incremental Linker Version 14.28.29336.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:app.exe
winmm.lib
app.obj

> .\app.exe
Hello!

有趣的是,您也可以 link 只是 Windowsapp.lib 代替:

> cl /EHsc windowsapp.lib src\app.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 19.28.29336 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

app.cpp
Microsoft (R) Incremental Linker Version 14.28.29336.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:app.exe
windowsapp.lib
app.obj

> .\app.exe
Hello!