Win32 API 日本語リファレンス
ホームSystem.Performance › PdhOpenLogA

PdhOpenLogA

関数
パフォーマンスデータのログファイルを開く(ANSI版)。
DLLpdh.dll文字セットANSI (-A)呼出規約winapi対応OSWindows XP 以降

シグネチャ

// pdh.dll  (ANSI / -A)
#include <windows.h>

DWORD PdhOpenLogA(
    LPCSTR szLogFileName,
    PDH_LOG dwAccessFlags,
    PDH_LOG_TYPE* lpdwLogType,
    PDH_HQUERY hQuery,   // optional
    DWORD dwMaxSize,
    LPCSTR szUserCaption,   // optional
    PDH_HLOG* phLog
);

パラメーター

名前方向説明
szLogFileNameLPCSTRin

開くログファイルの名前を指定する Null 終端文字列です。名前には絶対パスまたは相対パスを含めることができます。

lpdwLogType パラメーターが PDH_LOG_TYPE_SQL の場合は、ログファイルの名前を SQL:DataSourceName!LogFileName の形式で指定します。

dwAccessFlagsPDH_LOGin

ログファイルを開く際に使用するアクセスの種類です。次のいずれかの値を指定します。

意味
PDH_LOG_READ_ACCESS
ログファイルを読み取り用に開きます。
PDH_LOG_WRITE_ACCESS
新しいログファイルを書き込み用に開きます。
PDH_LOG_UPDATE_ACCESS
既存のログファイルを書き込み用に開きます。

ビット単位の論理和演算子 (|) を使用して、アクセスの種類と次の作成フラグの 1 つ以上を組み合わせることができます。

意味
PDH_LOG_CREATE_NEW
指定した名前で新しいログファイルを作成します。
PDH_LOG_CREATE_ALWAYS
指定した名前で新しいログファイルを作成します。ログファイルが既に存在する場合、この関数は新しいファイルを作成する前に既存のログファイルを削除します。
PDH_LOG_OPEN_EXISTING
指定した名前の既存のログファイルを開きます。指定した名前のログファイルが存在しない場合は、PDH_LOG_CREATE_NEW と同等になります。
PDH_LOG_OPEN_ALWAYS
指定した名前の既存のログファイルを開くか、指定した名前で新しいログファイルを作成します。
PDH_LOG_OPT_CIRCULAR
指定した名前で循環ログファイルを作成します。ファイルが dwMaxSize パラメーターの値に達すると、データはログファイルの先頭に折り返されます。このフラグは、lpdwLogType パラメーターが PDH_LOG_TYPE_BINARY の場合にのみ指定できます。
PDH_LOG_USER_STRING
PDH_LOG_TYPE_TSV と共に使用し、PdhUpdateLog または PdhOpenLogszUserString パラメーターで示されるユーザーキャプションまたはログファイルの説明を書き込みます。ユーザーキャプションまたはログファイルの説明は、テキストログの 1 行目の最後の列として書き込まれます。
lpdwLogTypePDH_LOG_TYPE*inout

開くログファイルの種類です。このパラメーターには次のいずれかの値を指定できます。

意味
PDH_LOG_TYPE_UNDEFINED
未定義のログファイル形式です。指定した場合、PDH がログファイルの種類を判定します。dwAccessFlags パラメーターが PDH_LOG_WRITE_ACCESS の場合は、この値を指定できません。
PDH_LOG_TYPE_CSV
1 行目に列見出しを含み、以降の各行に個々のデータレコードを含むテキストファイルです。各データレコードのフィールドはカンマ区切りです。

1 行目には、ファイルの形式、ログファイルの作成に使用された PDH のバージョン、および各カウンターの名前とパスに関する情報も含まれます。

PDH_LOG_TYPE_SQL
ログファイルのデータソースは SQL データベースです。
PDH_LOG_TYPE_TSV
1 行目に列見出しを含み、以降の各行に個々のデータレコードを含むテキストファイルです。各データレコードのフィールドはタブ区切りです。

1 行目には、ファイルの形式、ログファイルの作成に使用された PDH のバージョン、および各カウンターの名前とパスに関する情報も含まれます。

PDH_LOG_TYPE_BINARY
バイナリ形式のログファイルです。
hQueryPDH_HQUERYinoptional

クエリデータをログファイルに書き込む場合は、クエリハンドルを指定します。このハンドルは PdhOpenQuery 関数によって返されます。

ログファイルから読み取る場合、このパラメーターは無視されるため NULL を指定してください。

dwMaxSizeDWORDin

ログファイルの最大サイズ (バイト単位) です。ファイルサイズを制限する場合、または dwAccessFlagsPDH_LOG_OPT_CIRCULAR を指定する場合は最大サイズを指定します。それ以外の場合は 0 に設定します。

循環ログファイルの場合は、少なくとも 1 つのサンプルを格納できる十分な大きさの値を指定する必要があります。サンプルのサイズは収集されるデータによって異なります。ただし、少なくとも 1 メガバイトの値を指定すれば、ほとんどのサンプルに対応できます。

szUserCaptionLPCSTRinoptionalログファイルのユーザー定義キャプションを指定する Null 終端文字列です。ログファイルのキャプションは通常、ログファイルの内容を表します。既存のログファイルを開く場合、このパラメーターの値は無視されます。
phLogPDH_HLOG*out開いたログファイルへのハンドルです。

戻り値の型: DWORD

公式ドキュメント

指定したログファイルを読み取りまたは書き込み用に開きます。(ANSI)

戻り値

関数が成功した場合は、ERROR_SUCCESS を返します。

関数が失敗した場合、戻り値は システムエラーコード または PDH エラーコード です。

解説(Remarks)

この関数を使用してパフォーマンスデータをログファイルに書き込むには、この関数を呼び出す前に PdhOpenQuery を使用してクエリを開き、目的のカウンターを追加しておく必要があります。

新しいオペレーティングシステムは、古いオペレーティングシステムで生成されたログファイルを読み取ることができます。ただし、Windows Vista 以降のオペレーティングシステムで作成されたログファイルは、それより前のオペレーティングシステムでは読み取れません。

ログファイルには次の規則が適用されます。

例については、 Writing Performance Data to a Log File を参照してください。

メモ

pdh.h ヘッダーは、PdhOpenLog を、UNICODE プリプロセッサ定数の定義に基づいてこの関数の ANSI 版または Unicode 版を自動的に選択するエイリアスとして定義しています。エンコーディング非依存のエイリアスを、エンコーディング非依存でないコードと混在して使用すると、不整合が生じ、コンパイルエラーまたは実行時エラーの原因となる場合があります。詳細については、Conventions for Function Prototypes を参照してください。

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

各言語での呼び出し定義

// pdh.dll  (ANSI / -A)
#include <windows.h>

DWORD PdhOpenLogA(
    LPCSTR szLogFileName,
    PDH_LOG dwAccessFlags,
    PDH_LOG_TYPE* lpdwLogType,
    PDH_HQUERY hQuery,   // optional
    DWORD dwMaxSize,
    LPCSTR szUserCaption,   // optional
    PDH_HLOG* phLog
);
[DllImport("pdh.dll", CharSet = CharSet.Ansi, ExactSpelling = true)]
static extern uint PdhOpenLogA(
    [MarshalAs(UnmanagedType.LPStr)] string szLogFileName,   // LPCSTR
    uint dwAccessFlags,   // PDH_LOG
    ref uint lpdwLogType,   // PDH_LOG_TYPE* in/out
    IntPtr hQuery,   // PDH_HQUERY optional
    uint dwMaxSize,   // DWORD
    [MarshalAs(UnmanagedType.LPStr)] string szUserCaption,   // LPCSTR optional
    IntPtr phLog   // PDH_HLOG* out
);
<DllImport("pdh.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True)>
Public Shared Function PdhOpenLogA(
    <MarshalAs(UnmanagedType.LPStr)> szLogFileName As String,   ' LPCSTR
    dwAccessFlags As UInteger,   ' PDH_LOG
    ByRef lpdwLogType As UInteger,   ' PDH_LOG_TYPE* in/out
    hQuery As IntPtr,   ' PDH_HQUERY optional
    dwMaxSize As UInteger,   ' DWORD
    <MarshalAs(UnmanagedType.LPStr)> szUserCaption As String,   ' LPCSTR optional
    phLog As IntPtr   ' PDH_HLOG* out
) As UInteger
End Function
' szLogFileName : LPCSTR
' dwAccessFlags : PDH_LOG
' lpdwLogType : PDH_LOG_TYPE* in/out
' hQuery : PDH_HQUERY optional
' dwMaxSize : DWORD
' szUserCaption : LPCSTR optional
' phLog : PDH_HLOG* out
Declare PtrSafe Function PdhOpenLogA Lib "pdh" ( _
    ByVal szLogFileName As String, _
    ByVal dwAccessFlags As Long, _
    ByRef lpdwLogType As Long, _
    ByVal hQuery As LongPtr, _
    ByVal dwMaxSize As Long, _
    ByVal szUserCaption As String, _
    ByVal phLog As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

PdhOpenLogA = ctypes.windll.pdh.PdhOpenLogA
PdhOpenLogA.restype = wintypes.DWORD
PdhOpenLogA.argtypes = [
    wintypes.LPCSTR,  # szLogFileName : LPCSTR
    wintypes.DWORD,  # dwAccessFlags : PDH_LOG
    ctypes.c_void_p,  # lpdwLogType : PDH_LOG_TYPE* in/out
    wintypes.HANDLE,  # hQuery : PDH_HQUERY optional
    wintypes.DWORD,  # dwMaxSize : DWORD
    wintypes.LPCSTR,  # szUserCaption : LPCSTR optional
    ctypes.c_void_p,  # phLog : PDH_HLOG* out
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('pdh.dll')
PdhOpenLogA = Fiddle::Function.new(
  lib['PdhOpenLogA'],
  [
    Fiddle::TYPE_VOIDP,  # szLogFileName : LPCSTR
    -Fiddle::TYPE_INT,  # dwAccessFlags : PDH_LOG
    Fiddle::TYPE_VOIDP,  # lpdwLogType : PDH_LOG_TYPE* in/out
    Fiddle::TYPE_VOIDP,  # hQuery : PDH_HQUERY optional
    -Fiddle::TYPE_INT,  # dwMaxSize : DWORD
    Fiddle::TYPE_VOIDP,  # szUserCaption : LPCSTR optional
    Fiddle::TYPE_VOIDP,  # phLog : PDH_HLOG* out
  ],
  -Fiddle::TYPE_INT)
#[link(name = "pdh")]
extern "system" {
    fn PdhOpenLogA(
        szLogFileName: *const u8,  // LPCSTR
        dwAccessFlags: u32,  // PDH_LOG
        lpdwLogType: *mut u32,  // PDH_LOG_TYPE* in/out
        hQuery: *mut core::ffi::c_void,  // PDH_HQUERY optional
        dwMaxSize: u32,  // DWORD
        szUserCaption: *const u8,  // LPCSTR optional
        phLog: *mut *mut core::ffi::c_void  // PDH_HLOG* out
    ) -> u32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("pdh.dll", CharSet = CharSet.Ansi)]
public static extern uint PdhOpenLogA([MarshalAs(UnmanagedType.LPStr)] string szLogFileName, uint dwAccessFlags, ref uint lpdwLogType, IntPtr hQuery, uint dwMaxSize, [MarshalAs(UnmanagedType.LPStr)] string szUserCaption, IntPtr phLog);
"@
$api = Add-Type -MemberDefinition $sig -Name 'pdh_PdhOpenLogA' -Namespace Win32 -PassThru
# $api::PdhOpenLogA(szLogFileName, dwAccessFlags, lpdwLogType, hQuery, dwMaxSize, szUserCaption, phLog)
#uselib "pdh.dll"
#func global PdhOpenLogA "PdhOpenLogA" sptr, sptr, sptr, sptr, sptr, sptr, sptr
; PdhOpenLogA szLogFileName, dwAccessFlags, varptr(lpdwLogType), hQuery, dwMaxSize, szUserCaption, phLog   ; 戻り値は stat
; szLogFileName : LPCSTR -> "sptr"
; dwAccessFlags : PDH_LOG -> "sptr"
; lpdwLogType : PDH_LOG_TYPE* in/out -> "sptr"
; hQuery : PDH_HQUERY optional -> "sptr"
; dwMaxSize : DWORD -> "sptr"
; szUserCaption : LPCSTR optional -> "sptr"
; phLog : PDH_HLOG* out -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "pdh.dll"
#cfunc global PdhOpenLogA "PdhOpenLogA" str, int, var, sptr, int, str, sptr
; res = PdhOpenLogA(szLogFileName, dwAccessFlags, lpdwLogType, hQuery, dwMaxSize, szUserCaption, phLog)
; szLogFileName : LPCSTR -> "str"
; dwAccessFlags : PDH_LOG -> "int"
; lpdwLogType : PDH_LOG_TYPE* in/out -> "var"
; hQuery : PDH_HQUERY optional -> "sptr"
; dwMaxSize : DWORD -> "int"
; szUserCaption : LPCSTR optional -> "str"
; phLog : PDH_HLOG* out -> "sptr"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; DWORD PdhOpenLogA(LPCSTR szLogFileName, PDH_LOG dwAccessFlags, PDH_LOG_TYPE* lpdwLogType, PDH_HQUERY hQuery, DWORD dwMaxSize, LPCSTR szUserCaption, PDH_HLOG* phLog)
#uselib "pdh.dll"
#cfunc global PdhOpenLogA "PdhOpenLogA" str, int, var, intptr, int, str, intptr
; res = PdhOpenLogA(szLogFileName, dwAccessFlags, lpdwLogType, hQuery, dwMaxSize, szUserCaption, phLog)
; szLogFileName : LPCSTR -> "str"
; dwAccessFlags : PDH_LOG -> "int"
; lpdwLogType : PDH_LOG_TYPE* in/out -> "var"
; hQuery : PDH_HQUERY optional -> "intptr"
; dwMaxSize : DWORD -> "int"
; szUserCaption : LPCSTR optional -> "str"
; phLog : PDH_HLOG* out -> "intptr"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	pdh = windows.NewLazySystemDLL("pdh.dll")
	procPdhOpenLogA = pdh.NewProc("PdhOpenLogA")
)

// szLogFileName (LPCSTR), dwAccessFlags (PDH_LOG), lpdwLogType (PDH_LOG_TYPE* in/out), hQuery (PDH_HQUERY optional), dwMaxSize (DWORD), szUserCaption (LPCSTR optional), phLog (PDH_HLOG* out)
r1, _, err := procPdhOpenLogA.Call(
	uintptr(unsafe.Pointer(windows.BytePtrFromString(szLogFileName))),
	uintptr(dwAccessFlags),
	uintptr(lpdwLogType),
	uintptr(hQuery),
	uintptr(dwMaxSize),
	uintptr(unsafe.Pointer(windows.BytePtrFromString(szUserCaption))),
	uintptr(phLog),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // DWORD
function PdhOpenLogA(
  szLogFileName: PAnsiChar;   // LPCSTR
  dwAccessFlags: DWORD;   // PDH_LOG
  lpdwLogType: Pointer;   // PDH_LOG_TYPE* in/out
  hQuery: THandle;   // PDH_HQUERY optional
  dwMaxSize: DWORD;   // DWORD
  szUserCaption: PAnsiChar;   // LPCSTR optional
  phLog: Pointer   // PDH_HLOG* out
): DWORD; stdcall;
  external 'pdh.dll' name 'PdhOpenLogA';
result := DllCall("pdh\PdhOpenLogA"
    , "AStr", szLogFileName   ; LPCSTR
    , "UInt", dwAccessFlags   ; PDH_LOG
    , "Ptr", lpdwLogType   ; PDH_LOG_TYPE* in/out
    , "Ptr", hQuery   ; PDH_HQUERY optional
    , "UInt", dwMaxSize   ; DWORD
    , "AStr", szUserCaption   ; LPCSTR optional
    , "Ptr", phLog   ; PDH_HLOG* out
    , "UInt")   ; return: DWORD
●PdhOpenLogA(szLogFileName, dwAccessFlags, lpdwLogType, hQuery, dwMaxSize, szUserCaption, phLog) = DLL("pdh.dll", "dword PdhOpenLogA(char*, dword, void*, void*, dword, char*, void*)")
# 呼び出し: PdhOpenLogA(szLogFileName, dwAccessFlags, lpdwLogType, hQuery, dwMaxSize, szUserCaption, phLog)
# szLogFileName : LPCSTR -> "char*"
# dwAccessFlags : PDH_LOG -> "dword"
# lpdwLogType : PDH_LOG_TYPE* in/out -> "void*"
# hQuery : PDH_HQUERY optional -> "void*"
# dwMaxSize : DWORD -> "dword"
# szUserCaption : LPCSTR optional -> "char*"
# phLog : PDH_HLOG* out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "pdh" fn PdhOpenLogA(
    szLogFileName: [*c]const u8, // LPCSTR
    dwAccessFlags: u32, // PDH_LOG
    lpdwLogType: [*c]u32, // PDH_LOG_TYPE* in/out
    hQuery: ?*anyopaque, // PDH_HQUERY optional
    dwMaxSize: u32, // DWORD
    szUserCaption: [*c]const u8, // LPCSTR optional
    phLog: ?*anyopaque // PDH_HLOG* out
) callconv(std.os.windows.WINAPI) u32;
proc PdhOpenLogA(
    szLogFileName: cstring,  # LPCSTR
    dwAccessFlags: uint32,  # PDH_LOG
    lpdwLogType: ptr uint32,  # PDH_LOG_TYPE* in/out
    hQuery: pointer,  # PDH_HQUERY optional
    dwMaxSize: uint32,  # DWORD
    szUserCaption: cstring,  # LPCSTR optional
    phLog: pointer  # PDH_HLOG* out
): uint32 {.importc: "PdhOpenLogA", stdcall, dynlib: "pdh.dll".}
pragma(lib, "pdh");
extern(Windows)
uint PdhOpenLogA(
    const(char)* szLogFileName,   // LPCSTR
    uint dwAccessFlags,   // PDH_LOG
    uint* lpdwLogType,   // PDH_LOG_TYPE* in/out
    void* hQuery,   // PDH_HQUERY optional
    uint dwMaxSize,   // DWORD
    const(char)* szUserCaption,   // LPCSTR optional
    void* phLog   // PDH_HLOG* out
);
ccall((:PdhOpenLogA, "pdh.dll"), stdcall, UInt32,
      (Cstring, UInt32, Ptr{UInt32}, Ptr{Cvoid}, UInt32, Cstring, Ptr{Cvoid}),
      szLogFileName, dwAccessFlags, lpdwLogType, hQuery, dwMaxSize, szUserCaption, phLog)
# szLogFileName : LPCSTR -> Cstring
# dwAccessFlags : PDH_LOG -> UInt32
# lpdwLogType : PDH_LOG_TYPE* in/out -> Ptr{UInt32}
# hQuery : PDH_HQUERY optional -> Ptr{Cvoid}
# dwMaxSize : DWORD -> UInt32
# szUserCaption : LPCSTR optional -> Cstring
# phLog : PDH_HLOG* out -> Ptr{Cvoid}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
uint32_t PdhOpenLogA(
    const char* szLogFileName,
    uint32_t dwAccessFlags,
    uint32_t* lpdwLogType,
    void* hQuery,
    uint32_t dwMaxSize,
    const char* szUserCaption,
    void* phLog);
]]
local pdh = ffi.load("pdh")
-- pdh.PdhOpenLogA(szLogFileName, dwAccessFlags, lpdwLogType, hQuery, dwMaxSize, szUserCaption, phLog)
-- szLogFileName : LPCSTR
-- dwAccessFlags : PDH_LOG
-- lpdwLogType : PDH_LOG_TYPE* in/out
-- hQuery : PDH_HQUERY optional
-- dwMaxSize : DWORD
-- szUserCaption : LPCSTR optional
-- phLog : PDH_HLOG* out
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('pdh.dll');
const PdhOpenLogA = lib.func('__stdcall', 'PdhOpenLogA', 'uint32_t', ['str', 'uint32_t', 'uint32_t *', 'void *', 'uint32_t', 'str', 'void *']);
// PdhOpenLogA(szLogFileName, dwAccessFlags, lpdwLogType, hQuery, dwMaxSize, szUserCaption, phLog)
// szLogFileName : LPCSTR -> 'str'
// dwAccessFlags : PDH_LOG -> 'uint32_t'
// lpdwLogType : PDH_LOG_TYPE* in/out -> 'uint32_t *'
// hQuery : PDH_HQUERY optional -> 'void *'
// dwMaxSize : DWORD -> 'uint32_t'
// szUserCaption : LPCSTR optional -> 'str'
// phLog : PDH_HLOG* out -> 'void *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("pdh.dll", {
  PdhOpenLogA: { parameters: ["buffer", "u32", "pointer", "pointer", "u32", "buffer", "pointer"], result: "u32" },
});
// lib.symbols.PdhOpenLogA(szLogFileName, dwAccessFlags, lpdwLogType, hQuery, dwMaxSize, szUserCaption, phLog)
// szLogFileName : LPCSTR -> "buffer"
// dwAccessFlags : PDH_LOG -> "u32"
// lpdwLogType : PDH_LOG_TYPE* in/out -> "pointer"
// hQuery : PDH_HQUERY optional -> "pointer"
// dwMaxSize : DWORD -> "u32"
// szUserCaption : LPCSTR optional -> "buffer"
// phLog : PDH_HLOG* out -> "pointer"
// 文字列は "buffer"。ANSI(-A) は new TextEncoder() で UTF-8/ANSI バイト列(末尾に \x00)を渡す。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
uint32_t PdhOpenLogA(
    const char* szLogFileName,
    uint32_t dwAccessFlags,
    uint32_t* lpdwLogType,
    void* hQuery,
    uint32_t dwMaxSize,
    const char* szUserCaption,
    void* phLog);
C, "pdh.dll");
// $ffi->PdhOpenLogA(szLogFileName, dwAccessFlags, lpdwLogType, hQuery, dwMaxSize, szUserCaption, phLog);
// szLogFileName : LPCSTR
// dwAccessFlags : PDH_LOG
// lpdwLogType : PDH_LOG_TYPE* in/out
// hQuery : PDH_HQUERY optional
// dwMaxSize : DWORD
// szUserCaption : LPCSTR optional
// phLog : PDH_HLOG* out
// 構造体/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 Pdh extends StdCallLibrary {
    Pdh INSTANCE = Native.load("pdh", Pdh.class, W32APIOptions.ASCII_OPTIONS);
    int PdhOpenLogA(
        String szLogFileName,   // LPCSTR
        int dwAccessFlags,   // PDH_LOG
        IntByReference lpdwLogType,   // PDH_LOG_TYPE* in/out
        Pointer hQuery,   // PDH_HQUERY optional
        int dwMaxSize,   // DWORD
        String szUserCaption,   // LPCSTR optional
        Pointer phLog   // PDH_HLOG* out
    );
}
@[Link("pdh")]
lib Libpdh
  fun PdhOpenLogA = PdhOpenLogA(
    szLogFileName : UInt8*,   # LPCSTR
    dwAccessFlags : UInt32,   # PDH_LOG
    lpdwLogType : UInt32*,   # PDH_LOG_TYPE* in/out
    hQuery : Void*,   # PDH_HQUERY optional
    dwMaxSize : UInt32,   # DWORD
    szUserCaption : UInt8*,   # LPCSTR optional
    phLog : Void*   # PDH_HLOG* out
  ) : UInt32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef PdhOpenLogANative = Uint32 Function(Pointer<Utf8>, Uint32, Pointer<Uint32>, Pointer<Void>, Uint32, Pointer<Utf8>, Pointer<Void>);
typedef PdhOpenLogADart = int Function(Pointer<Utf8>, int, Pointer<Uint32>, Pointer<Void>, int, Pointer<Utf8>, Pointer<Void>);
final PdhOpenLogA = DynamicLibrary.open('pdh.dll')
    .lookupFunction<PdhOpenLogANative, PdhOpenLogADart>('PdhOpenLogA');
// szLogFileName : LPCSTR -> Pointer<Utf8>
// dwAccessFlags : PDH_LOG -> Uint32
// lpdwLogType : PDH_LOG_TYPE* in/out -> Pointer<Uint32>
// hQuery : PDH_HQUERY optional -> Pointer<Void>
// dwMaxSize : DWORD -> Uint32
// szUserCaption : LPCSTR optional -> Pointer<Utf8>
// phLog : PDH_HLOG* out -> Pointer<Void>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function PdhOpenLogA(
  szLogFileName: PAnsiChar;   // LPCSTR
  dwAccessFlags: DWORD;   // PDH_LOG
  lpdwLogType: Pointer;   // PDH_LOG_TYPE* in/out
  hQuery: THandle;   // PDH_HQUERY optional
  dwMaxSize: DWORD;   // DWORD
  szUserCaption: PAnsiChar;   // LPCSTR optional
  phLog: Pointer   // PDH_HLOG* out
): DWORD; stdcall;
  external 'pdh.dll' name 'PdhOpenLogA';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "PdhOpenLogA"
  c_PdhOpenLogA :: CString -> Word32 -> Ptr Word32 -> Ptr () -> Word32 -> CString -> Ptr () -> IO Word32
-- szLogFileName : LPCSTR -> CString
-- dwAccessFlags : PDH_LOG -> Word32
-- lpdwLogType : PDH_LOG_TYPE* in/out -> Ptr Word32
-- hQuery : PDH_HQUERY optional -> Ptr ()
-- dwMaxSize : DWORD -> Word32
-- szUserCaption : LPCSTR optional -> CString
-- phLog : PDH_HLOG* out -> Ptr ()
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let pdhopenloga =
  foreign "PdhOpenLogA"
    (string @-> uint32_t @-> (ptr uint32_t) @-> (ptr void) @-> uint32_t @-> string @-> (ptr void) @-> returning uint32_t)
(* szLogFileName : LPCSTR -> string *)
(* dwAccessFlags : PDH_LOG -> uint32_t *)
(* lpdwLogType : PDH_LOG_TYPE* in/out -> (ptr uint32_t) *)
(* hQuery : PDH_HQUERY optional -> (ptr void) *)
(* dwMaxSize : DWORD -> uint32_t *)
(* szUserCaption : LPCSTR optional -> string *)
(* phLog : PDH_HLOG* out -> (ptr void) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library pdh (t "pdh.dll"))
(cffi:use-foreign-library pdh)

(cffi:defcfun ("PdhOpenLogA" pdh-open-log-a :convention :stdcall) :uint32
  (sz-log-file-name :string)   ; LPCSTR
  (dw-access-flags :uint32)   ; PDH_LOG
  (lpdw-log-type :pointer)   ; PDH_LOG_TYPE* in/out
  (h-query :pointer)   ; PDH_HQUERY optional
  (dw-max-size :uint32)   ; DWORD
  (sz-user-caption :string)   ; LPCSTR optional
  (ph-log :pointer))   ; PDH_HLOG* out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $PdhOpenLogA = Win32::API::More->new('pdh',
    'DWORD PdhOpenLogA(LPCSTR szLogFileName, DWORD dwAccessFlags, LPVOID lpdwLogType, HANDLE hQuery, DWORD dwMaxSize, LPCSTR szUserCaption, HANDLE phLog)');
# my $ret = $PdhOpenLogA->Call($szLogFileName, $dwAccessFlags, $lpdwLogType, $hQuery, $dwMaxSize, $szUserCaption, $phLog);
# szLogFileName : LPCSTR -> LPCSTR
# dwAccessFlags : PDH_LOG -> DWORD
# lpdwLogType : PDH_LOG_TYPE* in/out -> LPVOID
# hQuery : PDH_HQUERY optional -> HANDLE
# dwMaxSize : DWORD -> DWORD
# szUserCaption : LPCSTR optional -> LPCSTR
# phLog : PDH_HLOG* out -> HANDLE
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

文字セット違い
公式の関連項目
使用する型