トップ回答者
timeGetTime()やtimeSetEvent()の使用について

質問
-
いつもお世話になっております。
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")
お忙しいところ恐縮ですが、ご教示の程、どうぞ宜しくお願いいたします。
回答
-
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
- 回答の候補に設定 Haruka6002Microsoft contingent staff, Moderator 2020年6月11日 2:27
- 回答としてマーク SHIN109 2020年6月12日 2:20
すべての返信
-
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のヘッダーも同じ構図でした)。
とっちゃん@わんくま同盟, Visual Studio and Development Technologies http://blogs.wankuma.com/tocchann/default.aspx
-
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日 5:03
-
とっちゃん 様、お馬鹿 様、仲澤@失業者 様
皆様、早速のレスありがとうございました。
お馬鹿 様
ありがとうございます。
その Project プロパティ設定 [全般] の "Windows SDK バージョン" は、どのような設定になっているのでしょうか?
当該プロジェクト内の場所に限らず記述してある#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"の方がいいのでしょうか?
どうぞ宜しくお願いいたします。 -
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
-
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
- 回答の候補に設定 Haruka6002Microsoft contingent staff, Moderator 2020年6月11日 2:27
- 回答としてマーク SHIN109 2020年6月12日 2:20
-
SHIN109さん、こんにちは。フォーラムオペレーターのHarukaです。
MSDNフォーラムにご投稿くださいましてありがとうございます。
ご質問いただいた件ですが、その後いかがでしょうか。
とっちゃんさんから寄せられた投稿はお役に立ちましたか。
参考になった投稿には [回答としてマーク] をお願い致します。
設定いただくことで、
他のユーザーもお役に立つ回答を見つけやすくなります。
お手数ですが、ご協力の程どうかよろしくお願いいたします。MSDN/ TechNet Community Support Haruka
~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~ -
とっちゃん 様
レスありがとうございました。
別の問題が発生しまして、本件から外れていてレス確認が遅れました。
返信遅くなり申し訳ありません。
テスト/調査、ありがとうございました。
MFCアプリ(DLLでも同様)の場合、afxv_w32.h という内部でインクルードするヘッダーで、強制的に WIN32_LEAN_AND_MEAN が定義されていました。
なので、回避策は個別にヘッダーをインクルードするという形しかないようです。
なるほどですね。合点いきました。
古い環境とのソース互換が必要という場合は、mmsystem.h でもいいと思います。
こちらの方が状況色濃そうなので、そのようにしたいと思います。
フォーラムオペレーター Haruka 様
お手数お掛けしました。ありがとうございました。
皆様、お忙しい中、ご丁寧にご教示くださり、誠にありがとうございました。