none
timeGetTime()やtimeSetEvent()の使用について RRS feed

  • 質問

  • いつもお世話になっております。

    VS2015U3 / Windows Kits(10.0.14393.0)で作業しています。


    表題の件で、timeGetTime()を使用するにあたり

    #include <windows.h>
    #pragma comment(lib, "winmm.lib")

    としますが、定義されていないとのことで使用できず、

    #include "mmsystem.h"

    することで使用できるようになります。(マルチメディアAPI)


    Windows Kitsの10.0.14393.0を使用しておりそれに含まれているようですが、

    windows.hのインクルードでは使用できなくなったのでしょうか?


    またmmsystem.hを使用する場合、winmm.libは厳密に必要でしょうか?
    #pragma comment(lib, "winmm.lib")

    お忙しいところ恐縮ですが、ご教示の程、どうぞ宜しくお願いいたします。
    2020年6月5日 2:22

回答

  • VS2019環境でちょっと実験してみました。

    結論から。

    MFCアプリ(DLLでも同様)の場合、afxv_w32.h という内部でインクルードするヘッダーで、強制的に WIN32_LEAN_AND_MEAN が定義されていました。

    なので、回避策は個別にヘッダーをインクルードするという形しかないようです。

    どのヘッダーをインクルードするのがいいか?についてはすでに記載していますが、windows.h は使えないので、timeapi.h がいいのではないでしょうか?

    古い環境とのソース互換が必要という場合は、mmsystem.h でもいいと思います。


    とっちゃん@わんくま同盟, Visual Studio and Development Technologies http://blogs.wankuma.com/tocchann/default.aspx

    2020年6月5日 12:23

すべての返信

  • Windows.h のインクルードより前に

    #define WIN32_LEAN_AND_MEAN

    などが入っていませんか?これがあると、よく使うヘッダー以外がインクルードされなくなります。

    winmm.lib の必要性は、特定のヘッダーではなく、特定のAPIがどこに実装されているか?に依存します。

    winmm.dll に実装があるAPIを使う場合、winmm.lib が必要で、その多くは mmsystem.h(かそこでインクルードされるヘッダー)に定義されています。

    基本的にこれらがどこにあるかなどは、docs.microsoft.com などで検索すればよいと思います。

    例えば、timeGetTime API ならここに最新定義があります(1.0.14393.0のヘッダーも同じ構図でした)。

    timeGetTime function


    とっちゃん@わんくま同盟, Visual Studio and Development Technologies http://blogs.wankuma.com/tocchann/default.aspx

    2020年6月5日 2:36
  • もしかしたら、Include Path の問題で、本来とは異なる "Windows.h" を参照していまっているのでは?
    その Project プロパティ設定 [全般] の "Windows SDK バージョン" は、どのような設定になっているのでしょうか?
    2020年6月5日 3:40
  • StdAfx.h内の「#define WIN32_LEAN_AND_MEAN」行をコメントにするか、
    又は#include <mmsystem.h>するかどちらかが必要です。
    (すでにとっちゃんさんが指摘ずみ)

    >またmmsystem.hを使用する場合、winmm.libは厳密に必要でしょうか?
    >#pragma comment(lib, "winmm.lib")

    timeSetEvent()関数、及びtimeGetTime()関数の実体はwinmm.lib内です。
    マニュアルにも必要であると明記されています。
    同ライブラリをリンクしないとリンクエラーLNK1120が発生します。


    2020年6月5日 4:51
  • とっちゃん 様、お馬鹿 様、仲澤@失業者 様

    皆様、早速のレスありがとうございました。



    お馬鹿 様

    ありがとうございます。

    その Project プロパティ設定 [全般] の "Windows SDK バージョン" は、どのような設定になっているのでしょうか?

    ターゲットプラットフォームバージョンで宜しいでしょうか?上記の 10.0.14393.0 でした。
    当該プロジェクト内の場所に限らず記述してある#include <windows.h>を、右クリックポップアップにある[ドキュメント<windows.h>を開く]では、

    ...\Windows Kits\10\Include\10.0.14393.0\um\Windows.hが呼び出されます。



    とっちゃん様、仲澤@失業者様

    当該プロジェクト内にWIN32_LEAN_AND_MEANは使っていませんでしたが、

    #include <windows.h>

    の記述位置が問題のようでした。

    StdAfx.hでMFC関係より先でなければならず(ほぼ先頭)、書いても直ちに有効にならない(マシンスペックかな?)ので、StdAfx.hをアクティブし直すことで、定義された状態になりました。

    今後ですが、#include "mmsystem.h"の方がいいのでしょうか?



    どうぞ宜しくお願いいたします。
    2020年6月5日 8:04
  • MFC アプリなら、こんなのがあると思います。

    #define VC_EXTRALEAN // Windows ヘッダーから使用されていない部分を除外します。

    これをコメントアウトしても使えたような気がしますが、覚えてない。。。

    今後ですが、#include "mmsystem.h"の方がいいのでしょうか?

    リファレンスで記載されているヘッダーにしておくのが一番いいのではないでしょうか?

    timeGetTime() であれば、timeapi.h か、windows.h のいずれかですね。


    とっちゃん@わんくま同盟, Visual Studio and Development Technologies http://blogs.wankuma.com/tocchann/default.aspx

    2020年6月5日 12:18
  • VS2019環境でちょっと実験してみました。

    結論から。

    MFCアプリ(DLLでも同様)の場合、afxv_w32.h という内部でインクルードするヘッダーで、強制的に WIN32_LEAN_AND_MEAN が定義されていました。

    なので、回避策は個別にヘッダーをインクルードするという形しかないようです。

    どのヘッダーをインクルードするのがいいか?についてはすでに記載していますが、windows.h は使えないので、timeapi.h がいいのではないでしょうか?

    古い環境とのソース互換が必要という場合は、mmsystem.h でもいいと思います。


    とっちゃん@わんくま同盟, Visual Studio and Development Technologies http://blogs.wankuma.com/tocchann/default.aspx

    2020年6月5日 12:23
  • SHIN109さん、こんにちは。フォーラムオペレーターのHarukaです。
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    ご質問いただいた件ですが、その後いかがでしょうか。
    とっちゃんさんから寄せられた投稿はお役に立ちましたか。

    参考になった投稿には [回答としてマーク] をお願い致します。

    設定いただくことで、
    他のユーザーもお役に立つ回答を見つけやすくなります。

    お手数ですが、ご協力の程どうかよろしくお願いいたします。

    MSDN/ TechNet Community Support Haruka
    ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2020年6月11日 2:32
    モデレータ
  • とっちゃん 様

    レスありがとうございました。
    別の問題が発生しまして、本件から外れていてレス確認が遅れました。
    返信遅くなり申し訳ありません。


    テスト/調査、ありがとうございました。

    MFCアプリ(DLLでも同様)の場合、afxv_w32.h という内部でインクルードするヘッダーで、強制的に WIN32_LEAN_AND_MEAN が定義されていました。

    なので、回避策は個別にヘッダーをインクルードするという形しかないようです。

    なるほどですね。合点いきました。

    古い環境とのソース互換が必要という場合は、mmsystem.h でもいいと思います。

    こちらの方が状況色濃そうなので、そのようにしたいと思います。



    フォーラムオペレーター Haruka 様

    お手数お掛けしました。ありがとうございました。



    皆様、お忙しい中、ご丁寧にご教示くださり、誠にありがとうございました。

    2020年6月12日 2:20