Win32 API 日本語リファレンス
ホーム › Networking.Clustering › CanResourceBeDependent

CanResourceBeDependent

関数
あるリソースが別のリソースに依存可能か判定する。
DLLCLUSAPI.dll呼出規約winapi対応OSwindowsserver2008

シグネチャ

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

BOOL CanResourceBeDependent(
    HRESOURCE hResource,
    HRESOURCE hResourceDependent
);

パラメーター

名前型方向説明
hResourceHRESOURCEin対象のリソースのハンドル。
hResourceDependentHRESOURCEinhResource で識別されるリソースが依存する可能性のあるリソースのハンドル。

戻り値の型: BOOL

公式ドキュメント

あるリソースが別のリソースに依存できるかどうかを判断します。

戻り値

戻り値 説明
TRUE
hResource で識別されるリソースは、hResourceDependent で識別されるリソースに依存できます。
FALSE
hResource で識別されるリソースは、hResourceDependent で識別されるリソースに依存できません。

解説(Remarks)

CanResourceBeDependent 関数において、hResource で識別されるリソースが hResourceDependent で識別されるリソースに依存するためには、次の条件を満たしている必要があります。

リソース DLL のエントリポイント関数から CanResourceBeDependent を呼び出さないでください。CanResourceBeDependent はワーカースレッドから安全に呼び出すことができます。詳細については、Function Calls to Avoid in Resource DLLs を参照してください。

LPC ハンドルと RPC ハンドルを同じ関数呼び出しに渡さないでください。渡した場合、呼び出しは RPC 例外を発生させ、さらに破壊的な影響を及ぼす可能性があります。LPC ハンドルと RPC ハンドルの作成方法については、Using Object Handles および OpenCluster を参照してください。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での呼び出し定義

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

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

CanResourceBeDependent = ctypes.windll.clusapi.CanResourceBeDependent
CanResourceBeDependent.restype = wintypes.BOOL
CanResourceBeDependent.argtypes = [
    ctypes.c_ssize_t,  # hResource : HRESOURCE
    ctypes.c_ssize_t,  # hResourceDependent : HRESOURCE
]
require 'fiddle'
require 'fiddle/import'

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

var (
	clusapi = windows.NewLazySystemDLL("CLUSAPI.dll")
	procCanResourceBeDependent = clusapi.NewProc("CanResourceBeDependent")
)

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

extern "clusapi" fn CanResourceBeDependent(
    hResource: isize, // HRESOURCE
    hResourceDependent: isize // HRESOURCE
) callconv(std.os.windows.WINAPI) i32;
proc CanResourceBeDependent(
    hResource: int,  # HRESOURCE
    hResourceDependent: int  # HRESOURCE
): int32 {.importc: "CanResourceBeDependent", stdcall, dynlib: "CLUSAPI.dll".}
pragma(lib, "clusapi");
extern(Windows)
int CanResourceBeDependent(
    ptrdiff_t hResource,   // HRESOURCE
    ptrdiff_t hResourceDependent   // HRESOURCE
);
ccall((:CanResourceBeDependent, "CLUSAPI.dll"), stdcall, Int32,
      (Int, Int),
      hResource, hResourceDependent)
# hResource : HRESOURCE -> Int
# hResourceDependent : HRESOURCE -> Int
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
int32_t CanResourceBeDependent(
    intptr_t hResource,
    intptr_t hResourceDependent);
]]
local clusapi = ffi.load("clusapi")
-- clusapi.CanResourceBeDependent(hResource, hResourceDependent)
-- hResource : HRESOURCE
-- hResourceDependent : HRESOURCE
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('CLUSAPI.dll');
const CanResourceBeDependent = lib.func('__stdcall', 'CanResourceBeDependent', 'int32_t', ['intptr_t', 'intptr_t']);
// CanResourceBeDependent(hResource, hResourceDependent)
// hResource : HRESOURCE -> 'intptr_t'
// hResourceDependent : HRESOURCE -> 'intptr_t'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("CLUSAPI.dll", {
  CanResourceBeDependent: { parameters: ["isize", "isize"], result: "i32" },
});
// lib.symbols.CanResourceBeDependent(hResource, hResourceDependent)
// hResource : HRESOURCE -> "isize"
// hResourceDependent : HRESOURCE -> "isize"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
int32_t CanResourceBeDependent(
    intptr_t hResource,
    intptr_t hResourceDependent);
C, "CLUSAPI.dll");
// $ffi->CanResourceBeDependent(hResource, hResourceDependent);
// hResource : HRESOURCE
// hResourceDependent : HRESOURCE
// 構造体/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 Clusapi extends StdCallLibrary {
    Clusapi INSTANCE = Native.load("clusapi", Clusapi.class);
    boolean CanResourceBeDependent(
        long hResource,   // HRESOURCE
        long hResourceDependent   // HRESOURCE
    );
}
@[Link("clusapi")]
lib LibCLUSAPI
  fun CanResourceBeDependent = CanResourceBeDependent(
    hResource : LibC::SSizeT,   # HRESOURCE
    hResourceDependent : LibC::SSizeT   # HRESOURCE
  ) : Int32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef CanResourceBeDependentNative = Int32 Function(IntPtr, IntPtr);
typedef CanResourceBeDependentDart = int Function(int, int);
final CanResourceBeDependent = DynamicLibrary.open('CLUSAPI.dll')
    .lookupFunction<CanResourceBeDependentNative, CanResourceBeDependentDart>('CanResourceBeDependent');
// hResource : HRESOURCE -> IntPtr
// hResourceDependent : HRESOURCE -> IntPtr
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function CanResourceBeDependent(
  hResource: NativeInt;   // HRESOURCE
  hResourceDependent: NativeInt   // HRESOURCE
): BOOL; stdcall;
  external 'CLUSAPI.dll' name 'CanResourceBeDependent';
import Foreign
import Foreign.C.Types
import Foreign.C.String

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

let canresourcebedependent =
  foreign "CanResourceBeDependent"
    (intptr_t @-> intptr_t @-> returning int32_t)
(* hResource : HRESOURCE -> intptr_t *)
(* hResourceDependent : HRESOURCE -> intptr_t *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library clusapi (t "CLUSAPI.dll"))
(cffi:use-foreign-library clusapi)

(cffi:defcfun ("CanResourceBeDependent" can-resource-be-dependent :convention :stdcall) :int32
  (h-resource :int64)   ; HRESOURCE
  (h-resource-dependent :int64))   ; HRESOURCE
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $CanResourceBeDependent = Win32::API::More->new('CLUSAPI',
    'BOOL CanResourceBeDependent(LPARAM hResource, LPARAM hResourceDependent)');
# my $ret = $CanResourceBeDependent->Call($hResource, $hResourceDependent);
# hResource : HRESOURCE -> LPARAM
# hResourceDependent : HRESOURCE -> LPARAM
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

公式の関連項目