SymInitializeW
関数シグネチャ
// dbghelp.dll (Unicode / -W)
#include <windows.h>
BOOL SymInitializeW(
HANDLE hProcess,
LPCWSTR UserSearchPath, // optional
BOOL fInvadeProcess
);パラメーター
| 名前 | 型 | 方向 | 説明 |
|---|---|---|---|
| hProcess | HANDLE | in | 呼び出し元を識別するハンドル。この値は一意かつ非ゼロである必要がありますが、プロセスハンドルである必要はありません。ただし、プロセスハンドルを使用する場合は、正しいハンドルを使用してください。アプリケーションがデバッガーの場合は、デバッグ対象プロセスのプロセスハンドルを使用します。別のプロセスをデバッグする際は、GetCurrentProcess が返すハンドルを使用しないでください。SymLoadModuleEx のような関数を呼び出すと予期しない結果になる可能性があるためです。 このパラメーターを NULL にすることはできません。 |
| UserSearchPath | LPCWSTR | inoptional | シンボルファイルの検索に使用される、セミコロン (;) で区切られたパス、または一連のパス。このパラメーターが NULL の場合、ライブラリは次のソースからシンボルパスの構成を試みます。
|
| fInvadeProcess | BOOL | in | この値が TRUE の場合、プロセスのロード済みモジュールを列挙し、各モジュールに対して実質的に SymLoadModule64 関数を呼び出します。 |
戻り値の型: BOOL
公式ドキュメント
SymInitializeW (Unicode) 関数は、プロセスのシンボルハンドラーを初期化します。
戻り値
関数が成功した場合、戻り値は TRUE です。
関数が失敗した場合、戻り値は FALSE です。拡張エラー情報を取得するには、GetLastError を呼び出します。
解説(Remarks)
SymInitialize 関数は、プロセスのシンボルハンドラーを初期化するために使用されます。シンボルハンドラーの文脈では、プロセスはシンボル情報を収集する際に使用する便利なオブジェクトです。通常、シンボルハンドラーは、デバッグ対象プロセスのシンボルをロードする必要があるデバッガーやその他のツールによって使用されます。
SymInitialize に渡すハンドルは、プロセスが呼び出す他のすべてのシンボルハンドラー関数に渡す値と同じである必要があります。これらの関数は、このハンドルを使用して呼び出し元を識別し、正しいシンボル情報を見つけます。シンボル情報の使用を終えたら、SymCleanup 関数を呼び出して、シンボルがロードされているプロセスに関連付けられたすべてのリソースを解放します。
シンボルファイルの検索は、UserSearchPath パラメーターで指定されたすべてのパスに対して再帰的に実行されます。したがって、検索でルートディレクトリを指定すると、ドライブ全体が検索され、相当な時間がかかる場合があります。プロセスの実行可能ファイルを含むディレクトリは、自動的には検索パスに含まれない点に注意してください。このディレクトリを検索パスに含めるには、GetModuleFileNameEx 関数を呼び出し、返されたパスを UserSearchPath に追加します。
SymInitialize を呼び出したプロセスは、先に SymCleanup を呼び出さない限り、再度呼び出してはなりません。SymInitialize の呼び出しで fInvadeProcess を TRUE に設定し、単にモジュールリストを再読み込みする必要がある場合は、SymRefreshModuleList 関数を使用します。
この関数を含むすべての DbgHelp 関数はシングルスレッドです。したがって、複数のスレッドからこの関数を呼び出すと、予期しない動作やメモリ破損が発生する可能性が高くなります。これを避けるため、SymInitialize はプロセスの開始時にのみ、SymCleanup はプロセスの終了時にのみ呼び出してください。プロセス内の各スレッドがこれらの関数を呼び出す必要はありません。
この関数の Unicode バージョンを呼び出すには、DBGHELP_TRANSLATE_TCHAR を定義します。
例
例については、Initializing the Symbol Handler を参照してください。
dbghelp.h ヘッダーは、UNICODE プリプロセッサ定数の定義に基づいてこの関数の ANSI 版または Unicode 版を自動的に選択するエイリアスとして SymInitialize を定義します。エンコード中立のエイリアスの使用と、エンコード中立でないコードを混在させると、コンパイルエラーや実行時エラーを引き起こす不一致につながる可能性があります。詳細については、Conventions for Function Prototypes を参照してください。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での呼び出し定義
// dbghelp.dll (Unicode / -W)
#include <windows.h>
BOOL SymInitializeW(
HANDLE hProcess,
LPCWSTR UserSearchPath, // optional
BOOL fInvadeProcess
);[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("dbghelp.dll", CharSet = CharSet.Unicode, SetLastError = true, ExactSpelling = true)]
static extern bool SymInitializeW(
IntPtr hProcess, // HANDLE
[MarshalAs(UnmanagedType.LPWStr)] string UserSearchPath, // LPCWSTR optional
bool fInvadeProcess // BOOL
);<DllImport("dbghelp.dll", CharSet:=CharSet.Unicode, SetLastError:=True, ExactSpelling:=True)>
Public Shared Function SymInitializeW(
hProcess As IntPtr, ' HANDLE
<MarshalAs(UnmanagedType.LPWStr)> UserSearchPath As String, ' LPCWSTR optional
fInvadeProcess As Boolean ' BOOL
) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function' hProcess : HANDLE
' UserSearchPath : LPCWSTR optional
' fInvadeProcess : BOOL
Declare PtrSafe Function SymInitializeW Lib "dbghelp" ( _
ByVal hProcess As LongPtr, _
ByVal UserSearchPath As LongPtr, _
ByVal fInvadeProcess As Long) As Long
' Unicode(W): 文字列は ByVal As LongPtr とし StrPtr(unicodeStr) を渡す
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。import ctypes
from ctypes import wintypes
SymInitializeW = ctypes.windll.dbghelp.SymInitializeW
SymInitializeW.restype = wintypes.BOOL
SymInitializeW.argtypes = [
wintypes.HANDLE, # hProcess : HANDLE
wintypes.LPCWSTR, # UserSearchPath : LPCWSTR optional
wintypes.BOOL, # fInvadeProcess : BOOL
]
# GetLastError: use ctypes.GetLastError() (or ctypes.WinDLL(use_last_error=True))require 'fiddle'
require 'fiddle/import'
lib = Fiddle.dlopen('dbghelp.dll')
SymInitializeW = Fiddle::Function.new(
lib['SymInitializeW'],
[
Fiddle::TYPE_VOIDP, # hProcess : HANDLE
Fiddle::TYPE_VOIDP, # UserSearchPath : LPCWSTR optional
Fiddle::TYPE_INT, # fInvadeProcess : BOOL
],
Fiddle::TYPE_INT)
# Wide strings: pass str.encode("UTF-16LE") + "\x00\x00"#[link(name = "dbghelp")]
extern "system" {
fn SymInitializeW(
hProcess: *mut core::ffi::c_void, // HANDLE
UserSearchPath: *const u16, // LPCWSTR optional
fInvadeProcess: i32 // BOOL
) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.$sig = @"
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("dbghelp.dll", CharSet = CharSet.Unicode, SetLastError = true)]
public static extern bool SymInitializeW(IntPtr hProcess, [MarshalAs(UnmanagedType.LPWStr)] string UserSearchPath, bool fInvadeProcess);
"@
$api = Add-Type -MemberDefinition $sig -Name 'dbghelp_SymInitializeW' -Namespace Win32 -PassThru
# $api::SymInitializeW(hProcess, UserSearchPath, fInvadeProcess)#uselib "dbghelp.dll"
#func global SymInitializeW "SymInitializeW" wptr, wptr, wptr
; SymInitializeW hProcess, UserSearchPath, fInvadeProcess ; 戻り値は stat
; hProcess : HANDLE -> "wptr"
; UserSearchPath : LPCWSTR optional -> "wptr"
; fInvadeProcess : BOOL -> "wptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。#uselib "dbghelp.dll"
#cfunc global SymInitializeW "SymInitializeW" sptr, wstr, int
; res = SymInitializeW(hProcess, UserSearchPath, fInvadeProcess)
; hProcess : HANDLE -> "sptr"
; UserSearchPath : LPCWSTR optional -> "wstr"
; fInvadeProcess : BOOL -> "int"; BOOL SymInitializeW(HANDLE hProcess, LPCWSTR UserSearchPath, BOOL fInvadeProcess)
#uselib "dbghelp.dll"
#cfunc global SymInitializeW "SymInitializeW" intptr, wstr, int
; res = SymInitializeW(hProcess, UserSearchPath, fInvadeProcess)
; hProcess : HANDLE -> "intptr"
; UserSearchPath : LPCWSTR optional -> "wstr"
; fInvadeProcess : BOOL -> "int"import (
"golang.org/x/sys/windows"
"unsafe"
)
var (
dbghelp = windows.NewLazySystemDLL("dbghelp.dll")
procSymInitializeW = dbghelp.NewProc("SymInitializeW")
)
// hProcess (HANDLE), UserSearchPath (LPCWSTR optional), fInvadeProcess (BOOL)
r1, _, err := procSymInitializeW.Call(
uintptr(hProcess),
uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(UserSearchPath))),
uintptr(fInvadeProcess),
)
_ = err // syscall.Errno (valid when the call sets last-error)
_ = r1 // BOOLfunction SymInitializeW(
hProcess: THandle; // HANDLE
UserSearchPath: PWideChar; // LPCWSTR optional
fInvadeProcess: BOOL // BOOL
): BOOL; stdcall;
external 'dbghelp.dll' name 'SymInitializeW';result := DllCall("dbghelp\SymInitializeW"
, "Ptr", hProcess ; HANDLE
, "WStr", UserSearchPath ; LPCWSTR optional
, "Int", fInvadeProcess ; BOOL
, "Int") ; return: BOOL●SymInitializeW(hProcess, UserSearchPath, fInvadeProcess) = DLL("dbghelp.dll", "bool SymInitializeW(void*, char*, bool)")
# 呼び出し: SymInitializeW(hProcess, UserSearchPath, fInvadeProcess)
# hProcess : HANDLE -> "void*"
# UserSearchPath : LPCWSTR optional -> "char*"
# fInvadeProcess : BOOL -> "bool"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
# ※-W(Unicode)関数。なでしこ1はANSIのため -A 版の利用を推奨。const std = @import("std");
extern "dbghelp" fn SymInitializeW(
hProcess: ?*anyopaque, // HANDLE
UserSearchPath: [*c]const u16, // LPCWSTR optional
fInvadeProcess: i32 // BOOL
) callconv(std.os.windows.WINAPI) i32;
// Unicode(-W): UTF-16LE のヌル終端バッファ([*c]const u16)を渡す。proc SymInitializeW(
hProcess: pointer, # HANDLE
UserSearchPath: WideCString, # LPCWSTR optional
fInvadeProcess: int32 # BOOL
): int32 {.importc: "SymInitializeW", stdcall, dynlib: "dbghelp.dll".}
# Unicode(-W): WideCString は newWideCString("...") で生成。pragma(lib, "dbghelp");
extern(Windows)
int SymInitializeW(
void* hProcess, // HANDLE
const(wchar)* UserSearchPath, // LPCWSTR optional
int fInvadeProcess // BOOL
);ccall((:SymInitializeW, "dbghelp.dll"), stdcall, Int32,
(Ptr{Cvoid}, Cwstring, Int32),
hProcess, UserSearchPath, fInvadeProcess)
# hProcess : HANDLE -> Ptr{Cvoid}
# UserSearchPath : LPCWSTR optional -> Cwstring
# fInvadeProcess : BOOL -> Int32
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
# Unicode(-W): Cwstring には transcode(UInt16, "...") 等で UTF-16 を渡す。local ffi = require("ffi")
ffi.cdef[[
int32_t SymInitializeW(
void* hProcess,
const uint16_t* UserSearchPath,
int32_t fInvadeProcess);
]]
local dbghelp = ffi.load("dbghelp")
-- dbghelp.SymInitializeW(hProcess, UserSearchPath, fInvadeProcess)
-- hProcess : HANDLE
-- UserSearchPath : LPCWSTR optional
-- fInvadeProcess : BOOL
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
-- Unicode(-W): uint16_t* には UTF-16LE のバッファ(ffi.new("uint16_t[?]", ...))を渡す。const koffi = require('koffi');
const lib = koffi.load('dbghelp.dll');
const SymInitializeW = lib.func('__stdcall', 'SymInitializeW', 'int32_t', ['void *', 'str16', 'int32_t']);
// SymInitializeW(hProcess, UserSearchPath, fInvadeProcess)
// hProcess : HANDLE -> 'void *'
// UserSearchPath : LPCWSTR optional -> 'str16'
// fInvadeProcess : BOOL -> 'int32_t'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。const lib = Deno.dlopen("dbghelp.dll", {
SymInitializeW: { parameters: ["pointer", "buffer", "i32"], result: "i32" },
});
// lib.symbols.SymInitializeW(hProcess, UserSearchPath, fInvadeProcess)
// hProcess : HANDLE -> "pointer"
// UserSearchPath : LPCWSTR optional -> "buffer"
// fInvadeProcess : BOOL -> "i32"
// 文字列は "buffer"。Unicode(-W) は new TextEncoder() ではなく UTF-16LE のバイト列(末尾に \x00\x00)を Uint8Array で渡す。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。<?php
$ffi = FFI::cdef(<<<C
int32_t SymInitializeW(
void* hProcess,
const uint16_t* UserSearchPath,
int32_t fInvadeProcess);
C, "dbghelp.dll");
// $ffi->SymInitializeW(hProcess, UserSearchPath, fInvadeProcess);
// hProcess : HANDLE
// UserSearchPath : LPCWSTR optional
// fInvadeProcess : BOOL
// 構造体/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 Dbghelp extends StdCallLibrary {
Dbghelp INSTANCE = Native.load("dbghelp", Dbghelp.class, W32APIOptions.UNICODE_OPTIONS);
boolean SymInitializeW(
Pointer hProcess, // HANDLE
WString UserSearchPath, // LPCWSTR optional
boolean fInvadeProcess // BOOL
);
}
// Unicode(-W): WString(入力)/char[](出力)で UTF-16 をマーシャリング。@[Link("dbghelp")]
lib Libdbghelp
fun SymInitializeW = SymInitializeW(
hProcess : Void*, # HANDLE
UserSearchPath : UInt16*, # LPCWSTR optional
fInvadeProcess : Int32 # BOOL
) : Int32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。import 'dart:ffi';
import 'package:ffi/ffi.dart';
typedef SymInitializeWNative = Int32 Function(Pointer<Void>, Pointer<Utf16>, Int32);
typedef SymInitializeWDart = int Function(Pointer<Void>, Pointer<Utf16>, int);
final SymInitializeW = DynamicLibrary.open('dbghelp.dll')
.lookupFunction<SymInitializeWNative, SymInitializeWDart>('SymInitializeW');
// hProcess : HANDLE -> Pointer<Void>
// UserSearchPath : LPCWSTR optional -> Pointer<Utf16>
// fInvadeProcess : BOOL -> Int32
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。{$mode objfpc}{$H+}
function SymInitializeW(
hProcess: THandle; // HANDLE
UserSearchPath: PWideChar; // LPCWSTR optional
fInvadeProcess: BOOL // BOOL
): BOOL; stdcall;
external 'dbghelp.dll' name 'SymInitializeW';import Foreign
import Foreign.C.Types
import Foreign.C.String
foreign import stdcall safe "SymInitializeW"
c_SymInitializeW :: Ptr () -> CWString -> CInt -> IO CInt
-- hProcess : HANDLE -> Ptr ()
-- UserSearchPath : LPCWSTR optional -> CWString
-- fInvadeProcess : BOOL -> CInt
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。open Ctypes
open Foreign
let syminitializew =
foreign "SymInitializeW"
((ptr void) @-> (ptr uint16_t) @-> int32_t @-> returning int32_t)
(* hProcess : HANDLE -> (ptr void) *)
(* UserSearchPath : LPCWSTR optional -> (ptr uint16_t) *)
(* fInvadeProcess : BOOL -> int32_t *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)(cffi:define-foreign-library dbghelp (t "dbghelp.dll"))
(cffi:use-foreign-library dbghelp)
(cffi:defcfun ("SymInitializeW" sym-initialize-w :convention :stdcall) :int32
(h-process :pointer) ; HANDLE
(user-search-path (:string :encoding :utf-16le)) ; LPCWSTR optional
(f-invade-process :int32)) ; BOOL
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。use Win32::API;
my $SymInitializeW = Win32::API::More->new('dbghelp',
'BOOL SymInitializeW(HANDLE hProcess, LPCWSTR UserSearchPath, BOOL fInvadeProcess)');
# my $ret = $SymInitializeW->Call($hProcess, $UserSearchPath, $fInvadeProcess);
# hProcess : HANDLE -> HANDLE
# UserSearchPath : LPCWSTR optional -> LPCWSTR
# fInvadeProcess : BOOL -> BOOL
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。
# Unicode(-W): LPCWSTR/LPWSTR は Win32::API が UTF-16 変換を行う。関連項目
- f GetModuleFileNameExW — 指定モジュールの完全パスをUnicode文字列で取得する。
- f SymCleanup — プロセスのシンボルハンドラを解放しリソースを後始末する。
- f SymEnumProcesses — シンボルハンドラに登録済みのプロセスを列挙する。
- f SymLoadModule — モジュールのシンボルテーブルを読み込む(旧式API)。
- f SymRefreshModuleList — プロセスのモジュール一覧を最新の状態に更新する。
- f SymSetSearchPathW — シンボル検索パスを設定する(Unicode版)。