Win32 API 日本語リファレンス
ホームStorage.FileSystem › SetSearchPathMode

SetSearchPathMode

関数
プロセスの安全な検索パスモードを設定する。
DLLKERNEL32.dll呼出規約winapiSetLastErrorあり対応OSWindows 7 以降

シグネチャ

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

BOOL SetSearchPathMode(
    DWORD Flags
);

パラメーター

名前方向説明
FlagsDWORDin

使用する検索モード。

意味
BASE_SEARCH_PATH_ENABLE_SAFE_SEARCHMODE
0x00000001
プロセスに対して安全なプロセス検索モードを有効にします。
BASE_SEARCH_PATH_DISABLE_SAFE_SEARCHMODE
0x00010000
プロセスに対して安全なプロセス検索モードを無効にします。
BASE_SEARCH_PATH_PERMANENT
0x00008000
     <b>BASE_SEARCH_PATH_ENABLE_SAFE_SEARCHMODE</b> と組み合わせて使用し、このモードをこのプロセスに対して永続的にするための省略可能なフラグです。これはビット単位の <b>OR</b> 演算によって行います:

(BASE_SEARCH_PATH_ENABLE_SAFE_SEARCHMODE | BASE_SEARCH_PATH_PERMANENT)

このフラグは BASE_SEARCH_PATH_DISABLE_SAFE_SEARCHMODE フラグと組み合わせることはできません。

戻り値の型: BOOL

公式ドキュメント

SearchPath 関数がファイルを検索する際に使用する、プロセスごとのモードを設定します。

戻り値

操作が正常に完了した場合、 SetSearchPathMode 関数は 0 以外の値を返します。

操作が失敗した場合、SetSearchPathMode 関数は 0 を返します。拡張エラー情報を取得するには、 GetLastError 関数を呼び出してください。

パラメーター値が無効であるために SetSearchPathMode 関数が失敗した場合、 GetLastError 関数が返す値は ERROR_INVALID_PARAMETER になります。

現在の状態とパラメーター値の組み合わせが無効であるために SetSearchPathMode 関数が失敗した場合、 GetLastError 関数が返す値は ERROR_ACCESS_DENIED になります。詳細については、「解説」セクションを参照してください。

解説(Remarks)

現在のプロセスに対して SetSearchPathMode 関数が正常に呼び出されていない場合、 SearchPath 関数が使用する検索モードはシステムレジストリから取得されます。詳細については、SearchPath を参照してください。

現在のプロセスに対して SetSearchPathMode 関数が正常に呼び出された後は、システムレジストリの設定は無視され、直近に正常に設定されたモードが優先されます。

Flags(BASE_SEARCH_PATH_ENABLE_SAFE_SEARCHMODE | BASE_SEARCH_PATH_PERMANENT) に設定して、現在のプロセスに対して SetSearchPathMode 関数が正常に呼び出された場合、呼び出し元のプロセスに対して安全モードが永続的に設定されます。そのプロセス内から検索モードを変更しようとする SetSearchPathMode 関数への以降の呼び出しは、いずれも GetLastError 関数からの ERROR_ACCESS_DENIED で失敗します。

Note 安全な検索モードを永続的に設定すると、設定されたプロセスが存続する間はそれを無効にできないため、慎重に検討して使用する必要があります。これは特に DLL 開発に当てはまり、その DLL の利用者がこのプロセス全体の設定の影響を受けることになります。
安全な検索モードを永続的に無効にすることはできません。

この関数はシステムレジストリを変更しません。

Windows 8 および Windows Server 2012 では、この関数は次のテクノロジーでサポートされています。

テクノロジー サポート
Server Message Block (SMB) 3.0 プロトコル はい
SMB 3.0 トランスペアレントフェールオーバー (TFO) はい
SMB 3.0 とスケールアウトファイル共有 (SO) はい
クラスター共有ボリュームファイルシステム (CsvFS) はい
回復性ファイルシステム (ReFS) はい
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での呼び出し定義

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

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

SetSearchPathMode = ctypes.windll.kernel32.SetSearchPathMode
SetSearchPathMode.restype = wintypes.BOOL
SetSearchPathMode.argtypes = [
    wintypes.DWORD,  # Flags : DWORD
]
# GetLastError: use ctypes.GetLastError() (or ctypes.WinDLL(use_last_error=True))
require 'fiddle'
require 'fiddle/import'

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

var (
	kernel32 = windows.NewLazySystemDLL("KERNEL32.dll")
	procSetSearchPathMode = kernel32.NewProc("SetSearchPathMode")
)

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

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

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

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

let setsearchpathmode =
  foreign "SetSearchPathMode"
    (uint32_t @-> returning int32_t)
(* Flags : DWORD -> uint32_t *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library kernel32 (t "KERNEL32.dll"))
(cffi:use-foreign-library kernel32)

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

関連項目

公式の関連項目