Win32 API 日本語リファレンス
ホームSystem.Com.StructuredStorage › StgOpenStorage

StgOpenStorage

関数
既存の複合ドキュメントファイルを開きルートストレージを取得する。
DLLOLE32.dll呼出規約winapi対応OSWindows 2000 以降

シグネチャ

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

HRESULT StgOpenStorage(
    LPCWSTR pwcsName,   // optional
    IStorage* pstgPriority,   // optional
    STGM grfMode,
    WORD** snbExclude,   // optional
    DWORD reserved,
    IStorage** ppstgOpen
);

パラメーター

名前方向説明
pwcsNameLPCWSTRinoptional開く対象のストレージ オブジェクトを格納しているファイルのパスを示す、null 終端の Unicode 文字列へのポインター。pstgPriority パラメーターが NULL でない場合、このパラメーターは無視されます。
pstgPriorityIStorage*inoptional

IStorage インターフェイスへのポインター。NULL を指定してください。NULL 以外を指定した場合、このパラメーターは後述の「解説」セクションで説明するように使用されます。

StgOpenStorage から復帰した後、pStgPriority で指定したストレージ オブジェクトは解放されている可能性があるため、以後は使用しないでください。

grfModeSTGMinストレージ オブジェクトを開くときに使用するアクセス モードを指定します。
snbExcludeWORD**inoptionalNULL 以外の場合は、ストレージ オブジェクトを開くときに除外するストレージ内の要素のブロックへのポインター。除外は、オープン時にスナップショット コピーが行われるかどうかにかかわらず実行されます。NULL を指定できます。
reservedDWORDin将来の使用のために予約されています。0 を指定する必要があります。
ppstgOpenIStorage**out開かれたストレージへのインターフェイス ポインターを受け取る IStorage* ポインター変数へのポインター。

戻り値の型: HRESULT

公式ドキュメント

ファイル システム上の既存のルート ストレージ オブジェクトを開きます。

戻り値

StgOpenStorage 関数は、HRESULT にラップされたファイル システム エラーまたはシステム エラーを返すこともあります。詳細については、 Error Handling Strategies および Handling Unknown Errors を参照してください。

解説(Remarks)

StgOpenStorage 関数は、grfMode パラメーターで指定されたアクセス モードに従って、指定されたルート ストレージ オブジェクトを開きます。成功した場合は、開かれたストレージ オブジェクトへの IStorage ポインターを ppstgOpen パラメーターに格納します。

サブストレージを持たないストレージ オブジェクトを保存するためのシンプル モードをサポートするため、 StgOpenStorage 関数は grfMode パラメーターの有効なモードとして次の 2 つのフラグの組み合わせのいずれかを受け付けます。

    STGM_SIMPLE | STGM_READWRITE | STGM_SHARE_EXCLUSIVE
    STGM_SIMPLE | STGM_READ | STGM_SHARE_EXCLUSIVE

シングル ライター/マルチ リーダーのダイレクト モードをサポートする場合、1 つ目のフラグの組み合わせがライター用の有効な grfMode パラメーターです。2 つ目のフラグの組み合わせはリーダー用として有効です。

    STGM_DIRECT_SWMR | STGM_READWRITE | STGM_SHARE_DENY_WRITE
    STGM_DIRECT_SWMR | STGM_READ | STGM_SHARE_DENY_NONE

ダイレクト モードでは、次の 3 つの組み合わせのいずれかが有効です。

    STGM_DIRECT | STGM_READWRITE | STGM_SHARE_EXCLUSIVE
    STGM_DIRECT | STGM_READ | STGM_SHARE_DENY_WRITE
    STGM_DIRECT | STGM_READ | STGM_SHARE_EXCLUSIVE
注意 他のユーザーへの書き込み許可を拒否せずに (grfMode パラメーターで STGM_SHARE_DENY_WRITE を指定せずに) 読み取り/書き込みモードでストレージ オブジェクトを開くと、 StgOpenStorage の呼び出しがストレージ オブジェクト全体のスナップショットを作成する必要があるため、時間がかかる操作になることがあります。
アプリケーションは多くの場合、次のアクセス許可でストレージ オブジェクトを開こうとします。成功すれば、スナップショット コピーを作成する必要はまったくありません。
STGM_READWRITE | STGM_SHARE_DENY_WRITE 
    // transacted versus direct mode omitted for exposition 

前述のアクセス許可での取得に失敗した場合、アプリケーションは次のアクセス許可に切り替えて、スナップショット コピーを作成できます。時間のかかるコピーを作成する前に、アプリケーションはユーザーに確認を求めるべきです。

STGM_READWRITE 
    // transacted versus direct mode omitted for exposition 

これらのアクセス モードが意味するドキュメント共有のセマンティクスが適切であれば、アプリケーションは次のようにストレージを開くこともできます。この場合、成功したときにスナップショット コピーは作成されません (STGM_SHARE_DENY_WRITE を指定して他のユーザーの書き込みアクセスを拒否しているため)。

STGM_READ | STGM_SHARE_DENY_WRITE 
    // transacted versus direct mode omitted for exposition 
注意 スナップショット コピー作成のコストを削減するために、アプリケーションはストレージ オブジェクトを優先モード (grfModeSTGM_PRIORITY を指定) で開くことができます。
snbExclude パラメーターは、ストレージ オブジェクトを開くときに空にする、このストレージ オブジェクト内の要素名の集合を指定します。ストリームは長さ 0 に設定され、ストレージ オブジェクトはそのすべての要素が削除されます。特定のストリームを除外することで、スナップショット コピー作成のコストを大幅に削減できます。この方法は、ほとんどの場合、最初にストレージ オブジェクトを優先モードで開き、除外対象となる要素をすべてメモリに読み込んだ後に使用されます。この先行して優先モードで開いたストレージ オブジェクトを pstgPriority パラメーターで渡すことで、優先モードによる排他を解除します。除外された項目の内容をコミット前に書き直す責任は、呼び出し元のアプリケーションにあります。したがって、この手法が有用なのは、ドキュメントがアクティブな間にストレージ オブジェクトへ常時アクセスする必要がないアプリケーションに限られます。

pstgPriority パラメーターは、既存のストレージ オブジェクト (多くは優先モードで開かれたもの) を、同じファイルに対して別のモードで開いた新しいストレージ オブジェクトに置き換える呼び出し元のための利便性を目的としています。pstgPriorityNULL でない場合、ファイル名の指定には pwcsName ではなくこのパラメーターが使用され、pwcsName は無視されます。ただし、StgOpenStorage は状況によってオブジェクトを解放したりしなかったりするため、アプリケーションでは常に pstgPriorityNULL を渡すことをお勧めします。特に、関数が失敗を返した場合、呼び出し元はストレージ オブジェクトが解放されたかどうかを判断できません。

pstgPriority パラメーターの機能は、次の例のように、呼び出し元がより安全な方法で再現できます。

// Replacement for:
// HRESULT hr = StgOpenStorage(
//         NULL, pstgPriority, grfMode, NULL, 0, &pstgNew);

STATSTG statstg;
HRESULT hr = pstgPriority->Stat(&statstg, 0);
pStgPriority->Release();
pStgPriority = NULL;
if (SUCCEEDED(hr))
{
    hr = StgOpenStorage(statstg.pwcsName, NULL, grfMode, NULL, 0, &pstgNew);
}     
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での呼び出し定義

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

HRESULT StgOpenStorage(
    LPCWSTR pwcsName,   // optional
    IStorage* pstgPriority,   // optional
    STGM grfMode,
    WORD** snbExclude,   // optional
    DWORD reserved,
    IStorage** ppstgOpen
);
[DllImport("OLE32.dll", ExactSpelling = true)]
static extern int StgOpenStorage(
    [MarshalAs(UnmanagedType.LPWStr)] string pwcsName,   // LPCWSTR optional
    IntPtr pstgPriority,   // IStorage* optional
    uint grfMode,   // STGM
    IntPtr snbExclude,   // WORD** optional
    uint reserved,   // DWORD
    IntPtr ppstgOpen   // IStorage** out
);
<DllImport("OLE32.dll", ExactSpelling:=True)>
Public Shared Function StgOpenStorage(
    <MarshalAs(UnmanagedType.LPWStr)> pwcsName As String,   ' LPCWSTR optional
    pstgPriority As IntPtr,   ' IStorage* optional
    grfMode As UInteger,   ' STGM
    snbExclude As IntPtr,   ' WORD** optional
    reserved As UInteger,   ' DWORD
    ppstgOpen As IntPtr   ' IStorage** out
) As Integer
End Function
' pwcsName : LPCWSTR optional
' pstgPriority : IStorage* optional
' grfMode : STGM
' snbExclude : WORD** optional
' reserved : DWORD
' ppstgOpen : IStorage** out
Declare PtrSafe Function StgOpenStorage Lib "ole32" ( _
    ByVal pwcsName As LongPtr, _
    ByVal pstgPriority As LongPtr, _
    ByVal grfMode As Long, _
    ByVal snbExclude As LongPtr, _
    ByVal reserved As Long, _
    ByVal ppstgOpen As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

StgOpenStorage = ctypes.windll.ole32.StgOpenStorage
StgOpenStorage.restype = ctypes.c_int
StgOpenStorage.argtypes = [
    wintypes.LPCWSTR,  # pwcsName : LPCWSTR optional
    ctypes.c_void_p,  # pstgPriority : IStorage* optional
    wintypes.DWORD,  # grfMode : STGM
    ctypes.c_void_p,  # snbExclude : WORD** optional
    wintypes.DWORD,  # reserved : DWORD
    ctypes.c_void_p,  # ppstgOpen : IStorage** out
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('OLE32.dll')
StgOpenStorage = Fiddle::Function.new(
  lib['StgOpenStorage'],
  [
    Fiddle::TYPE_VOIDP,  # pwcsName : LPCWSTR optional
    Fiddle::TYPE_VOIDP,  # pstgPriority : IStorage* optional
    -Fiddle::TYPE_INT,  # grfMode : STGM
    Fiddle::TYPE_VOIDP,  # snbExclude : WORD** optional
    -Fiddle::TYPE_INT,  # reserved : DWORD
    Fiddle::TYPE_VOIDP,  # ppstgOpen : IStorage** out
  ],
  Fiddle::TYPE_INT)
#[link(name = "ole32")]
extern "system" {
    fn StgOpenStorage(
        pwcsName: *const u16,  // LPCWSTR optional
        pstgPriority: *mut core::ffi::c_void,  // IStorage* optional
        grfMode: u32,  // STGM
        snbExclude: *mut *mut u16,  // WORD** optional
        reserved: u32,  // DWORD
        ppstgOpen: *mut *mut core::ffi::c_void  // IStorage** out
    ) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("OLE32.dll")]
public static extern int StgOpenStorage([MarshalAs(UnmanagedType.LPWStr)] string pwcsName, IntPtr pstgPriority, uint grfMode, IntPtr snbExclude, uint reserved, IntPtr ppstgOpen);
"@
$api = Add-Type -MemberDefinition $sig -Name 'OLE32_StgOpenStorage' -Namespace Win32 -PassThru
# $api::StgOpenStorage(pwcsName, pstgPriority, grfMode, snbExclude, reserved, ppstgOpen)
#uselib "OLE32.dll"
#func global StgOpenStorage "StgOpenStorage" sptr, sptr, sptr, sptr, sptr, sptr
; StgOpenStorage pwcsName, pstgPriority, grfMode, varptr(snbExclude), reserved, ppstgOpen   ; 戻り値は stat
; pwcsName : LPCWSTR optional -> "sptr"
; pstgPriority : IStorage* optional -> "sptr"
; grfMode : STGM -> "sptr"
; snbExclude : WORD** optional -> "sptr"
; reserved : DWORD -> "sptr"
; ppstgOpen : IStorage** out -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "OLE32.dll"
#cfunc global StgOpenStorage "StgOpenStorage" wstr, sptr, int, var, int, sptr
; res = StgOpenStorage(pwcsName, pstgPriority, grfMode, snbExclude, reserved, ppstgOpen)
; pwcsName : LPCWSTR optional -> "wstr"
; pstgPriority : IStorage* optional -> "sptr"
; grfMode : STGM -> "int"
; snbExclude : WORD** optional -> "var"
; reserved : DWORD -> "int"
; ppstgOpen : IStorage** out -> "sptr"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; HRESULT StgOpenStorage(LPCWSTR pwcsName, IStorage* pstgPriority, STGM grfMode, WORD** snbExclude, DWORD reserved, IStorage** ppstgOpen)
#uselib "OLE32.dll"
#cfunc global StgOpenStorage "StgOpenStorage" wstr, intptr, int, var, int, intptr
; res = StgOpenStorage(pwcsName, pstgPriority, grfMode, snbExclude, reserved, ppstgOpen)
; pwcsName : LPCWSTR optional -> "wstr"
; pstgPriority : IStorage* optional -> "intptr"
; grfMode : STGM -> "int"
; snbExclude : WORD** optional -> "var"
; reserved : DWORD -> "int"
; ppstgOpen : IStorage** out -> "intptr"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	ole32 = windows.NewLazySystemDLL("OLE32.dll")
	procStgOpenStorage = ole32.NewProc("StgOpenStorage")
)

// pwcsName (LPCWSTR optional), pstgPriority (IStorage* optional), grfMode (STGM), snbExclude (WORD** optional), reserved (DWORD), ppstgOpen (IStorage** out)
r1, _, err := procStgOpenStorage.Call(
	uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(pwcsName))),
	uintptr(pstgPriority),
	uintptr(grfMode),
	uintptr(snbExclude),
	uintptr(reserved),
	uintptr(ppstgOpen),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // HRESULT
function StgOpenStorage(
  pwcsName: PWideChar;   // LPCWSTR optional
  pstgPriority: Pointer;   // IStorage* optional
  grfMode: DWORD;   // STGM
  snbExclude: Pointer;   // WORD** optional
  reserved: DWORD;   // DWORD
  ppstgOpen: Pointer   // IStorage** out
): Integer; stdcall;
  external 'OLE32.dll' name 'StgOpenStorage';
result := DllCall("OLE32\StgOpenStorage"
    , "WStr", pwcsName   ; LPCWSTR optional
    , "Ptr", pstgPriority   ; IStorage* optional
    , "UInt", grfMode   ; STGM
    , "Ptr", snbExclude   ; WORD** optional
    , "UInt", reserved   ; DWORD
    , "Ptr", ppstgOpen   ; IStorage** out
    , "Int")   ; return: HRESULT
●StgOpenStorage(pwcsName, pstgPriority, grfMode, snbExclude, reserved, ppstgOpen) = DLL("OLE32.dll", "int StgOpenStorage(char*, void*, dword, void*, dword, void*)")
# 呼び出し: StgOpenStorage(pwcsName, pstgPriority, grfMode, snbExclude, reserved, ppstgOpen)
# pwcsName : LPCWSTR optional -> "char*"
# pstgPriority : IStorage* optional -> "void*"
# grfMode : STGM -> "dword"
# snbExclude : WORD** optional -> "void*"
# reserved : DWORD -> "dword"
# ppstgOpen : IStorage** out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

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

typedef StgOpenStorageNative = Int32 Function(Pointer<Utf16>, Pointer<Void>, Uint32, Pointer<Uint16>, Uint32, Pointer<Void>);
typedef StgOpenStorageDart = int Function(Pointer<Utf16>, Pointer<Void>, int, Pointer<Uint16>, int, Pointer<Void>);
final StgOpenStorage = DynamicLibrary.open('OLE32.dll')
    .lookupFunction<StgOpenStorageNative, StgOpenStorageDart>('StgOpenStorage');
// pwcsName : LPCWSTR optional -> Pointer<Utf16>
// pstgPriority : IStorage* optional -> Pointer<Void>
// grfMode : STGM -> Uint32
// snbExclude : WORD** optional -> Pointer<Uint16>
// reserved : DWORD -> Uint32
// ppstgOpen : IStorage** out -> Pointer<Void>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function StgOpenStorage(
  pwcsName: PWideChar;   // LPCWSTR optional
  pstgPriority: Pointer;   // IStorage* optional
  grfMode: DWORD;   // STGM
  snbExclude: Pointer;   // WORD** optional
  reserved: DWORD;   // DWORD
  ppstgOpen: Pointer   // IStorage** out
): Integer; stdcall;
  external 'OLE32.dll' name 'StgOpenStorage';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "StgOpenStorage"
  c_StgOpenStorage :: CWString -> Ptr () -> Word32 -> Ptr Word16 -> Word32 -> Ptr () -> IO Int32
-- pwcsName : LPCWSTR optional -> CWString
-- pstgPriority : IStorage* optional -> Ptr ()
-- grfMode : STGM -> Word32
-- snbExclude : WORD** optional -> Ptr Word16
-- reserved : DWORD -> Word32
-- ppstgOpen : IStorage** out -> Ptr ()
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let stgopenstorage =
  foreign "StgOpenStorage"
    ((ptr uint16_t) @-> (ptr void) @-> uint32_t @-> (ptr uint16_t) @-> uint32_t @-> (ptr void) @-> returning int32_t)
(* pwcsName : LPCWSTR optional -> (ptr uint16_t) *)
(* pstgPriority : IStorage* optional -> (ptr void) *)
(* grfMode : STGM -> uint32_t *)
(* snbExclude : WORD** optional -> (ptr uint16_t) *)
(* reserved : DWORD -> uint32_t *)
(* ppstgOpen : IStorage** out -> (ptr void) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library ole32 (t "OLE32.dll"))
(cffi:use-foreign-library ole32)

(cffi:defcfun ("StgOpenStorage" stg-open-storage :convention :stdcall) :int32
  (pwcs-name (:string :encoding :utf-16le))   ; LPCWSTR optional
  (pstg-priority :pointer)   ; IStorage* optional
  (grf-mode :uint32)   ; STGM
  (snb-exclude :pointer)   ; WORD** optional
  (reserved :uint32)   ; DWORD
  (ppstg-open :pointer))   ; IStorage** out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $StgOpenStorage = Win32::API::More->new('OLE32',
    'int StgOpenStorage(LPCWSTR pwcsName, LPVOID pstgPriority, DWORD grfMode, LPVOID snbExclude, DWORD reserved, LPVOID ppstgOpen)');
# my $ret = $StgOpenStorage->Call($pwcsName, $pstgPriority, $grfMode, $snbExclude, $reserved, $ppstgOpen);
# pwcsName : LPCWSTR optional -> LPCWSTR
# pstgPriority : IStorage* optional -> LPVOID
# grfMode : STGM -> DWORD
# snbExclude : WORD** optional -> LPVOID
# reserved : DWORD -> DWORD
# ppstgOpen : IStorage** out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

類似 API
公式の関連項目
使用する型