Win32 API 日本語リファレンス
ホームUI.WindowsAndMessaging › IsWow64Message

IsWow64Message

関数
直前メッセージがWOW64プロセス由来かを判定する。
DLLUSER32.dll呼出規約winapi対応OSWindows Vista 以降

シグネチャ

// USER32.dll
#include <windows.h>

BOOL IsWow64Message(void);

パラメーターなし。戻り値: BOOL

公式ドキュメント

現在のスレッドのキューから最後に読み取られたメッセージが WOW64 プロセスに由来するかどうかを判定します。

戻り値

現在のスレッドのキューから最後に読み取られたメッセージが WOW64 プロセスに由来する場合は TRUE を、そうでない場合は FALSE を返します。

解説(Remarks)

この関数は、ポインターに依存するデータを含むデータ構造に関連付けられたメッセージである場合に、32 ビットのクライアント アプリケーションから送信されたプライベート メッセージを受信できる 64 ビットのネイティブ アプリケーションを開発する際に役立ちます。このような状況では、64 ビットのネイティブ アプリケーション内でこの関数を呼び出すことで、メッセージが WOW64 プロセスに由来するかどうかを判定し、メッセージを適切にサンク (thunk) できます。

この関数をサポートしないオペレーティング システムとの互換性のため、 GetProcAddress を呼び出して IsWow64Message が User32.dll に実装されているかどうかを検出します。GetProcAddress が成功した場合は、この関数を安全に呼び出せます。それ以外の場合、WOW64 は存在しません。なお、この手法はオペレーティング システムが 64 ビット版の Windows であるかどうかを検出する信頼できる方法ではありません。現在のバージョンの 32 ビット版 Windows の User32.dll にもこの関数が含まれているためです。

#include <windows.h>
#include <tchar.h>

typedef BOOL (WINAPI *LPFN_ISWOW64MESSAGE) (void);

LPFN_ISWOW64MESSAGE fnIsWow64Message;

BOOL IsWow64Msg()
{
    // IsWow64Message is not available on all supported versions of Windows
    // Use LoadLibrary to ensure that the DLL containing the function is loaded
    // and GetProcAddress to get a pointer to the function if available.

    fnIsWow64Message = (LPFN_ISWOW64MESSAGE) GetProcAddress(
        LoadLibrary(TEXT("user32")), "IsWow64Message");
  
    if (NULL != fnIsWow64Message)
    {        
        return (fnIsWow64Message());
    }
    else return FALSE;
}

int main( void )
{
    if(IsWow64Msg())
    {
        _tprintf(TEXT("The last message was from a 32-bit process.\n"));
    }
    else if (NULL == fnIsWow64Message )
    {
        _tprintf(TEXT("The IsWow64Message function is not available (%d).\n"), GetLastError());
    }
    else 
    {
        _tprintf(TEXT("The last message was from a 64-bit process.\n"));
    }
    return 0;
}
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での呼び出し定義

// USER32.dll
#include <windows.h>

BOOL IsWow64Message(void);
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("USER32.dll", ExactSpelling = true)]
static extern bool IsWow64Message();
<DllImport("USER32.dll", ExactSpelling:=True)>
Public Shared Function IsWow64Message() As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function
Declare PtrSafe Function IsWow64Message Lib "user32" () As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

IsWow64Message = ctypes.windll.user32.IsWow64Message
IsWow64Message.restype = wintypes.BOOL
IsWow64Message.argtypes = []
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('USER32.dll')
IsWow64Message = Fiddle::Function.new(
  lib['IsWow64Message'],
  [],
  Fiddle::TYPE_INT)
#[link(name = "user32")]
extern "system" {
    fn IsWow64Message() -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("USER32.dll")]
public static extern bool IsWow64Message();
"@
$api = Add-Type -MemberDefinition $sig -Name 'USER32_IsWow64Message' -Namespace Win32 -PassThru
# $api::IsWow64Message()
#uselib "USER32.dll"
#func global IsWow64Message "IsWow64Message"
; IsWow64Message   ; 戻り値は stat
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
#uselib "USER32.dll"
#cfunc global IsWow64Message "IsWow64Message"
; res = IsWow64Message()
; BOOL IsWow64Message()
#uselib "USER32.dll"
#cfunc global IsWow64Message "IsWow64Message"
; res = IsWow64Message()
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	user32 = windows.NewLazySystemDLL("USER32.dll")
	procIsWow64Message = user32.NewProc("IsWow64Message")
)

r1, _, err := procIsWow64Message.Call()
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // BOOL
function IsWow64Message: BOOL; stdcall;
  external 'USER32.dll' name 'IsWow64Message';
result := DllCall("USER32\IsWow64Message", "Int")
●IsWow64Message() = DLL("USER32.dll", "bool IsWow64Message()")
# 呼び出し: IsWow64Message()
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "user32" fn IsWow64Message() callconv(std.os.windows.WINAPI) i32;
proc IsWow64Message(): int32 {.importc: "IsWow64Message", stdcall, dynlib: "USER32.dll".}
pragma(lib, "user32");
extern(Windows)
int IsWow64Message();
ccall((:IsWow64Message, "USER32.dll"), stdcall, Int32,
      (),
      )
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
int32_t IsWow64Message(void);
]]
local user32 = ffi.load("user32")
-- user32.IsWow64Message()
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('USER32.dll');
const IsWow64Message = lib.func('__stdcall', 'IsWow64Message', 'int32_t', []);
// IsWow64Message()
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("USER32.dll", {
  IsWow64Message: { parameters: [], result: "i32" },
});
// lib.symbols.IsWow64Message()
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
int32_t IsWow64Message(void);
C, "USER32.dll");
// $ffi->IsWow64Message();
// 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
// WINAPI(stdcall): x64 では呼出規約が統一されるため問題なし。x86 では __stdcall 対応のラッパが必要な場合あり。
import com.sun.jna.*;
import com.sun.jna.ptr.*;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.win32.W32APIOptions;

public interface User32 extends StdCallLibrary {
    User32 INSTANCE = Native.load("user32", User32.class);
    boolean IsWow64Message();
}
@[Link("user32")]
lib LibUSER32
  fun IsWow64Message = IsWow64Message() : Int32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef IsWow64MessageNative = Int32 Function();
typedef IsWow64MessageDart = int Function();
final IsWow64Message = DynamicLibrary.open('USER32.dll')
    .lookupFunction<IsWow64MessageNative, IsWow64MessageDart>('IsWow64Message');
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function IsWow64Message: BOOL; stdcall;
  external 'USER32.dll' name 'IsWow64Message';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "IsWow64Message"
  c_IsWow64Message :: IO CInt
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let iswow64message =
  foreign "IsWow64Message"
    (void @-> returning int32_t)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library user32 (t "USER32.dll"))
(cffi:use-foreign-library user32)

(cffi:defcfun ("IsWow64Message" is-wow64-message :convention :stdcall) :int32)
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $IsWow64Message = Win32::API::More->new('USER32',
    'BOOL IsWow64Message()');
# my $ret = $IsWow64Message->Call();
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

公式の関連項目