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

OleCreateLinkEx

関数
拡張オプション付きでモニカからリンクオブジェクトを作成する。
DLLOLE32.dll呼出規約winapi対応OSWindows 2000 以降

シグネチャ

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

HRESULT OleCreateLinkEx(
    IMoniker* pmkLinkSrc,
    const GUID* riid,
    OLECREATE dwFlags,
    DWORD renderopt,
    DWORD cFormats,
    DWORD* rgAdvf,
    FORMATETC* rgFormatEtc,
    IAdviseSink* lpAdviseSink,
    DWORD* rgdwConnection,
    IOleClientSite* pClientSite,
    IStorage* pStg,
    void** ppvObj
);

パラメーター

名前方向説明
pmkLinkSrcIMoniker*inリンク先となるオブジェクトへのモニカーへのポインター。
riidGUID*in返されるオブジェクトのインターフェイスの識別子への参照。
dwFlagsOLECREATEinこのパラメーターには 0 または OLECREATE_LEAVERUNNING (0x00000001) を指定できます。
renderoptDWORDinOLERENDER 列挙体から取得される値。
cFormatsDWORDinrenderoptOLERENDER_FORMAT の場合、rgFormatEtc 配列内の FORMATETC 構造体の数を示します。1 以上である必要があります。それ以外の場合、このパラメーターは 0 でなければなりません。
rgAdvfDWORD*inrenderoptOLERENDER_FORMAT の場合、DWORD 要素の配列を指します。各要素は ADVF 列挙体の値の組み合わせです。この配列の各要素は、pAdviseSinkNULL か非 NULL かに応じて (下記参照)、IOleCache::Cache または IDataObject::DAdvise の呼び出しに advf パラメーターとして渡されます。それ以外の場合、このパラメーターは NULL でなければなりません。
rgFormatEtcFORMATETC*inrenderoptOLERENDER_FORMAT の場合、FORMATETC 構造体の配列を指します。pAdviseSinkNULL の場合、この配列の各要素はオブジェクトの IOleCache::Cache の呼び出しに pFormatEtc パラメーターとして渡されます。これにより、オブジェクトのインプロセスハンドラー (通常は既定のハンドラー) が管理するデータおよび表示キャッシュに、表示データやその他のキャッシュ可能なデータが設定されます。pAdviseSink が非 NULL の場合、この配列の各要素は IDataObject::DAdvise の呼び出しに pFormatEtc パラメーターとして渡されます。これにより、呼び出し元 (通常は OLE コンテナー) は、オブジェクトから受け取ったデータを独自にキャッシュまたは処理できます。
lpAdviseSinkIAdviseSink*inrenderoptOLERENDER_FORMAT の場合、データアドバイスのカスタムキャッシュまたは処理を示す有効な IAdviseSink ポインター、またはデータ形式の既定のキャッシュを示す NULL のいずれかを指定できます。
rgdwConnectionDWORD*outIDataObject::DAdvise を使用して各アドバイザリ接続に対して IAdviseSink インターフェイスが登録される際に返される dwConnection 値の配列を返す場所。返されるアドバイザリ接続が不要な場合は NULL を指定します。pAdviseSinkNULL の場合、このパラメーターは NULL でなければなりません。
pClientSiteIOleClientSite*inオブジェクトがコンテナーにサービスを要求する際に使用する主要なインターフェイスへのポインター。このパラメーターには NULL を指定できます。その場合、できるだけ早く IOleObject::SetClientSite を使用してクライアントサイトを確立するのは呼び出し元の責任となります。
pStgIStorage*inオブジェクト、およびそのオブジェクトに対して確立された既定のデータキャッシュまたは表示キャッシュに使用するストレージへのポインター。
ppvObjvoid**outriid で要求されたインターフェイスポインターを受け取る出力ポインター変数のアドレス。正常に返された場合、*ppvObj には、新しく作成されたオブジェクトに対して要求されたインターフェイスポインターが格納されます。

戻り値の型: HRESULT

公式ドキュメント

OleCreateLink の機能を拡張し、OleCreateLink がサポートする単一形式ではなく、複数の表示形式またはデータ形式のキャッシュを必要とするコンテナーにおいて、オブジェクトをより効率的にインスタンス化できるようにします。

戻り値

この関数は、成功した場合に S_OK を返します。その他に返される可能性のある値は次のとおりです。

戻り値 説明
E_NOINTERFACE
指定されたインターフェイス識別子が無効です。
E_INVALIDARG
1 つ以上のパラメーターが無効です。

解説(Remarks)

次の OleCreateLink の呼び出しは、

OleCreateLink(pmkLinkSrc, riid, renderopt, pFormatEtc, pClientSite, pStg, ppvObj);

次の OleCreateLinkEx の呼び出しと同等です。

DWORD    advf = ADVF_PRIMEFIRST;
    OleCreateFromFileEx(pmkLinkSrc, riid, renderopt, 1, &advf, pFormatEtc, NULL, NULL, pClientSite, pStg, ppvObj);

既存のインスタンス化関数 (OleCreateOleCreateFromFileOleCreateFromDataOleCreateLinkOleCreateLinkToFile、および OleCreateLinkFromData) は、インスタンス化中に既定のキャッシュ場所 (渡された IStorage の '\001OlePresXXX' ストリーム内) に、単一の表示形式またはデータ形式のキャッシュのみを作成します。さらに、これらのキャッシュは、オブジェクトが次に実行状態に入ったときに作成される必要があります。ほとんどのアプリケーションは少なくとも 2 つの表示形式 (画面とプリンター) のキャッシュを必要とし、また、ハンドラーとは異なる形式や場所にデータをキャッシュする必要がある場合があるため、アプリケーションは通常、オブジェクト作成時 (Insert Object、Insert Object from File、Paste Object) にデータキャッシュをプライミングするために、オブジェクトサーバーを複数回起動および終了する必要があります。

これらの作成関数の拡張版は、この問題を解決します。OleCreateExOleCreateFromFileExOleCreateFromDataExOleCreateLinkExOleCreateLinkToFileEx、および OleCreateLinkFromDataEx には、次の新しいパラメーターが含まれています。追加のオプションを示す dwFlags、キャッシュする形式の数を示す cFormats、キャッシュする各形式のアドバイズフラグを指定する ADVF 列挙体からの rgAdvf、表示 (既定ハンドラー) キャッシュまたはデータ (非既定ハンドラー) キャッシュのどちらが必要かを示す pAdviseSinkIDataObject::DAdvise のクッキーを返す rgdwConnection、そして単一の形式ではなく形式の配列である rgFormatEtc です。

複数の表示形式をオブジェクトのハンドラーによって自分の代わりにキャッシュさせる必要があるコンテナーは、単にこれらの関数を呼び出し、cFormats に形式の数、rgAdvf に各形式の ADVF フラグ、rgFormatEtc に形式のセットを指定するだけで済みます。これらのコンテナーは pAdviseSinkNULL を渡します。

すべてのデータキャッシュまたは表示キャッシュを自分自身で実行するコンテナーは、これらと同じ手順を実行しますが、非 NULLpAdviseSink を渡します。これらのコンテナーは、IAdviseSink::OnDataChange 中に、オブジェクトまたはデータの独自のキャッシュまたは操作を実行します。通常、このようなコンテナーは ADVF_NODATA を使用してアドバイザリ接続を確立することはありませんが、それを行うことが禁止されているわけではありません。

これらの新しい関数は OLE 複合ドキュメント用です。これらの関数を使用することで、アプリケーションは現行の関数で必要とされる繰り返しの起動および初期化の手順を回避できます。これらは、既定のデータキャッシュおよび表示キャッシュを使用する OLE 複合ドキュメントコンテナーアプリケーション、ならびに、基盤となる IDataObject::DAdvise サポートから独自のキャッシュおよびデータ転送を提供するアプリケーションを対象としています。

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

各言語での呼び出し定義

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

HRESULT OleCreateLinkEx(
    IMoniker* pmkLinkSrc,
    const GUID* riid,
    OLECREATE dwFlags,
    DWORD renderopt,
    DWORD cFormats,
    DWORD* rgAdvf,
    FORMATETC* rgFormatEtc,
    IAdviseSink* lpAdviseSink,
    DWORD* rgdwConnection,
    IOleClientSite* pClientSite,
    IStorage* pStg,
    void** ppvObj
);
[DllImport("OLE32.dll", ExactSpelling = true)]
static extern int OleCreateLinkEx(
    IntPtr pmkLinkSrc,   // IMoniker*
    ref Guid riid,   // GUID*
    uint dwFlags,   // OLECREATE
    uint renderopt,   // DWORD
    uint cFormats,   // DWORD
    ref uint rgAdvf,   // DWORD*
    IntPtr rgFormatEtc,   // FORMATETC*
    IntPtr lpAdviseSink,   // IAdviseSink*
    out uint rgdwConnection,   // DWORD* out
    IntPtr pClientSite,   // IOleClientSite*
    IntPtr pStg,   // IStorage*
    IntPtr ppvObj   // void** out
);
<DllImport("OLE32.dll", ExactSpelling:=True)>
Public Shared Function OleCreateLinkEx(
    pmkLinkSrc As IntPtr,   ' IMoniker*
    ByRef riid As Guid,   ' GUID*
    dwFlags As UInteger,   ' OLECREATE
    renderopt As UInteger,   ' DWORD
    cFormats As UInteger,   ' DWORD
    ByRef rgAdvf As UInteger,   ' DWORD*
    rgFormatEtc As IntPtr,   ' FORMATETC*
    lpAdviseSink As IntPtr,   ' IAdviseSink*
    <Out> ByRef rgdwConnection As UInteger,   ' DWORD* out
    pClientSite As IntPtr,   ' IOleClientSite*
    pStg As IntPtr,   ' IStorage*
    ppvObj As IntPtr   ' void** out
) As Integer
End Function
' pmkLinkSrc : IMoniker*
' riid : GUID*
' dwFlags : OLECREATE
' renderopt : DWORD
' cFormats : DWORD
' rgAdvf : DWORD*
' rgFormatEtc : FORMATETC*
' lpAdviseSink : IAdviseSink*
' rgdwConnection : DWORD* out
' pClientSite : IOleClientSite*
' pStg : IStorage*
' ppvObj : void** out
Declare PtrSafe Function OleCreateLinkEx Lib "ole32" ( _
    ByVal pmkLinkSrc As LongPtr, _
    ByVal riid As LongPtr, _
    ByVal dwFlags As Long, _
    ByVal renderopt As Long, _
    ByVal cFormats As Long, _
    ByRef rgAdvf As Long, _
    ByVal rgFormatEtc As LongPtr, _
    ByVal lpAdviseSink As LongPtr, _
    ByRef rgdwConnection As Long, _
    ByVal pClientSite As LongPtr, _
    ByVal pStg As LongPtr, _
    ByVal ppvObj As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

OleCreateLinkEx = ctypes.windll.ole32.OleCreateLinkEx
OleCreateLinkEx.restype = ctypes.c_int
OleCreateLinkEx.argtypes = [
    ctypes.c_void_p,  # pmkLinkSrc : IMoniker*
    ctypes.c_void_p,  # riid : GUID*
    wintypes.DWORD,  # dwFlags : OLECREATE
    wintypes.DWORD,  # renderopt : DWORD
    wintypes.DWORD,  # cFormats : DWORD
    ctypes.POINTER(wintypes.DWORD),  # rgAdvf : DWORD*
    ctypes.c_void_p,  # rgFormatEtc : FORMATETC*
    ctypes.c_void_p,  # lpAdviseSink : IAdviseSink*
    ctypes.POINTER(wintypes.DWORD),  # rgdwConnection : DWORD* out
    ctypes.c_void_p,  # pClientSite : IOleClientSite*
    ctypes.c_void_p,  # pStg : IStorage*
    ctypes.c_void_p,  # ppvObj : void** out
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('OLE32.dll')
OleCreateLinkEx = Fiddle::Function.new(
  lib['OleCreateLinkEx'],
  [
    Fiddle::TYPE_VOIDP,  # pmkLinkSrc : IMoniker*
    Fiddle::TYPE_VOIDP,  # riid : GUID*
    -Fiddle::TYPE_INT,  # dwFlags : OLECREATE
    -Fiddle::TYPE_INT,  # renderopt : DWORD
    -Fiddle::TYPE_INT,  # cFormats : DWORD
    Fiddle::TYPE_VOIDP,  # rgAdvf : DWORD*
    Fiddle::TYPE_VOIDP,  # rgFormatEtc : FORMATETC*
    Fiddle::TYPE_VOIDP,  # lpAdviseSink : IAdviseSink*
    Fiddle::TYPE_VOIDP,  # rgdwConnection : DWORD* out
    Fiddle::TYPE_VOIDP,  # pClientSite : IOleClientSite*
    Fiddle::TYPE_VOIDP,  # pStg : IStorage*
    Fiddle::TYPE_VOIDP,  # ppvObj : void** out
  ],
  Fiddle::TYPE_INT)
#[link(name = "ole32")]
extern "system" {
    fn OleCreateLinkEx(
        pmkLinkSrc: *mut core::ffi::c_void,  // IMoniker*
        riid: *const GUID,  // GUID*
        dwFlags: u32,  // OLECREATE
        renderopt: u32,  // DWORD
        cFormats: u32,  // DWORD
        rgAdvf: *mut u32,  // DWORD*
        rgFormatEtc: *mut FORMATETC,  // FORMATETC*
        lpAdviseSink: *mut core::ffi::c_void,  // IAdviseSink*
        rgdwConnection: *mut u32,  // DWORD* out
        pClientSite: *mut core::ffi::c_void,  // IOleClientSite*
        pStg: *mut core::ffi::c_void,  // IStorage*
        ppvObj: *mut *mut ()  // void** out
    ) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("OLE32.dll")]
public static extern int OleCreateLinkEx(IntPtr pmkLinkSrc, ref Guid riid, uint dwFlags, uint renderopt, uint cFormats, ref uint rgAdvf, IntPtr rgFormatEtc, IntPtr lpAdviseSink, out uint rgdwConnection, IntPtr pClientSite, IntPtr pStg, IntPtr ppvObj);
"@
$api = Add-Type -MemberDefinition $sig -Name 'OLE32_OleCreateLinkEx' -Namespace Win32 -PassThru
# $api::OleCreateLinkEx(pmkLinkSrc, riid, dwFlags, renderopt, cFormats, rgAdvf, rgFormatEtc, lpAdviseSink, rgdwConnection, pClientSite, pStg, ppvObj)
#uselib "OLE32.dll"
#func global OleCreateLinkEx "OleCreateLinkEx" sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr
; OleCreateLinkEx pmkLinkSrc, varptr(riid), dwFlags, renderopt, cFormats, varptr(rgAdvf), varptr(rgFormatEtc), lpAdviseSink, varptr(rgdwConnection), pClientSite, pStg, ppvObj   ; 戻り値は stat
; pmkLinkSrc : IMoniker* -> "sptr"
; riid : GUID* -> "sptr"
; dwFlags : OLECREATE -> "sptr"
; renderopt : DWORD -> "sptr"
; cFormats : DWORD -> "sptr"
; rgAdvf : DWORD* -> "sptr"
; rgFormatEtc : FORMATETC* -> "sptr"
; lpAdviseSink : IAdviseSink* -> "sptr"
; rgdwConnection : DWORD* out -> "sptr"
; pClientSite : IOleClientSite* -> "sptr"
; pStg : IStorage* -> "sptr"
; ppvObj : void** out -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "OLE32.dll"
#cfunc global OleCreateLinkEx "OleCreateLinkEx" sptr, var, int, int, int, var, var, sptr, var, sptr, sptr, sptr
; res = OleCreateLinkEx(pmkLinkSrc, riid, dwFlags, renderopt, cFormats, rgAdvf, rgFormatEtc, lpAdviseSink, rgdwConnection, pClientSite, pStg, ppvObj)
; pmkLinkSrc : IMoniker* -> "sptr"
; riid : GUID* -> "var"
; dwFlags : OLECREATE -> "int"
; renderopt : DWORD -> "int"
; cFormats : DWORD -> "int"
; rgAdvf : DWORD* -> "var"
; rgFormatEtc : FORMATETC* -> "var"
; lpAdviseSink : IAdviseSink* -> "sptr"
; rgdwConnection : DWORD* out -> "var"
; pClientSite : IOleClientSite* -> "sptr"
; pStg : IStorage* -> "sptr"
; ppvObj : void** out -> "sptr"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; HRESULT OleCreateLinkEx(IMoniker* pmkLinkSrc, GUID* riid, OLECREATE dwFlags, DWORD renderopt, DWORD cFormats, DWORD* rgAdvf, FORMATETC* rgFormatEtc, IAdviseSink* lpAdviseSink, DWORD* rgdwConnection, IOleClientSite* pClientSite, IStorage* pStg, void** ppvObj)
#uselib "OLE32.dll"
#cfunc global OleCreateLinkEx "OleCreateLinkEx" intptr, var, int, int, int, var, var, intptr, var, intptr, intptr, intptr
; res = OleCreateLinkEx(pmkLinkSrc, riid, dwFlags, renderopt, cFormats, rgAdvf, rgFormatEtc, lpAdviseSink, rgdwConnection, pClientSite, pStg, ppvObj)
; pmkLinkSrc : IMoniker* -> "intptr"
; riid : GUID* -> "var"
; dwFlags : OLECREATE -> "int"
; renderopt : DWORD -> "int"
; cFormats : DWORD -> "int"
; rgAdvf : DWORD* -> "var"
; rgFormatEtc : FORMATETC* -> "var"
; lpAdviseSink : IAdviseSink* -> "intptr"
; rgdwConnection : DWORD* out -> "var"
; pClientSite : IOleClientSite* -> "intptr"
; pStg : IStorage* -> "intptr"
; ppvObj : void** out -> "intptr"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	ole32 = windows.NewLazySystemDLL("OLE32.dll")
	procOleCreateLinkEx = ole32.NewProc("OleCreateLinkEx")
)

// pmkLinkSrc (IMoniker*), riid (GUID*), dwFlags (OLECREATE), renderopt (DWORD), cFormats (DWORD), rgAdvf (DWORD*), rgFormatEtc (FORMATETC*), lpAdviseSink (IAdviseSink*), rgdwConnection (DWORD* out), pClientSite (IOleClientSite*), pStg (IStorage*), ppvObj (void** out)
r1, _, err := procOleCreateLinkEx.Call(
	uintptr(pmkLinkSrc),
	uintptr(riid),
	uintptr(dwFlags),
	uintptr(renderopt),
	uintptr(cFormats),
	uintptr(rgAdvf),
	uintptr(rgFormatEtc),
	uintptr(lpAdviseSink),
	uintptr(rgdwConnection),
	uintptr(pClientSite),
	uintptr(pStg),
	uintptr(ppvObj),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // HRESULT
function OleCreateLinkEx(
  pmkLinkSrc: Pointer;   // IMoniker*
  riid: PGUID;   // GUID*
  dwFlags: DWORD;   // OLECREATE
  renderopt: DWORD;   // DWORD
  cFormats: DWORD;   // DWORD
  rgAdvf: Pointer;   // DWORD*
  rgFormatEtc: Pointer;   // FORMATETC*
  lpAdviseSink: Pointer;   // IAdviseSink*
  rgdwConnection: Pointer;   // DWORD* out
  pClientSite: Pointer;   // IOleClientSite*
  pStg: Pointer;   // IStorage*
  ppvObj: Pointer   // void** out
): Integer; stdcall;
  external 'OLE32.dll' name 'OleCreateLinkEx';
result := DllCall("OLE32\OleCreateLinkEx"
    , "Ptr", pmkLinkSrc   ; IMoniker*
    , "Ptr", riid   ; GUID*
    , "UInt", dwFlags   ; OLECREATE
    , "UInt", renderopt   ; DWORD
    , "UInt", cFormats   ; DWORD
    , "Ptr", rgAdvf   ; DWORD*
    , "Ptr", rgFormatEtc   ; FORMATETC*
    , "Ptr", lpAdviseSink   ; IAdviseSink*
    , "Ptr", rgdwConnection   ; DWORD* out
    , "Ptr", pClientSite   ; IOleClientSite*
    , "Ptr", pStg   ; IStorage*
    , "Ptr", ppvObj   ; void** out
    , "Int")   ; return: HRESULT
●OleCreateLinkEx(pmkLinkSrc, riid, dwFlags, renderopt, cFormats, rgAdvf, rgFormatEtc, lpAdviseSink, rgdwConnection, pClientSite, pStg, ppvObj) = DLL("OLE32.dll", "int OleCreateLinkEx(void*, void*, dword, dword, dword, void*, void*, void*, void*, void*, void*, void*)")
# 呼び出し: OleCreateLinkEx(pmkLinkSrc, riid, dwFlags, renderopt, cFormats, rgAdvf, rgFormatEtc, lpAdviseSink, rgdwConnection, pClientSite, pStg, ppvObj)
# pmkLinkSrc : IMoniker* -> "void*"
# riid : GUID* -> "void*"
# dwFlags : OLECREATE -> "dword"
# renderopt : DWORD -> "dword"
# cFormats : DWORD -> "dword"
# rgAdvf : DWORD* -> "void*"
# rgFormatEtc : FORMATETC* -> "void*"
# lpAdviseSink : IAdviseSink* -> "void*"
# rgdwConnection : DWORD* out -> "void*"
# pClientSite : IOleClientSite* -> "void*"
# pStg : IStorage* -> "void*"
# ppvObj : void** out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

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

typedef OleCreateLinkExNative = Int32 Function(Pointer<Void>, Pointer<Void>, Uint32, Uint32, Uint32, Pointer<Uint32>, Pointer<Void>, Pointer<Void>, Pointer<Uint32>, Pointer<Void>, Pointer<Void>, Pointer<Void>);
typedef OleCreateLinkExDart = int Function(Pointer<Void>, Pointer<Void>, int, int, int, Pointer<Uint32>, Pointer<Void>, Pointer<Void>, Pointer<Uint32>, Pointer<Void>, Pointer<Void>, Pointer<Void>);
final OleCreateLinkEx = DynamicLibrary.open('OLE32.dll')
    .lookupFunction<OleCreateLinkExNative, OleCreateLinkExDart>('OleCreateLinkEx');
// pmkLinkSrc : IMoniker* -> Pointer<Void>
// riid : GUID* -> Pointer<Void>
// dwFlags : OLECREATE -> Uint32
// renderopt : DWORD -> Uint32
// cFormats : DWORD -> Uint32
// rgAdvf : DWORD* -> Pointer<Uint32>
// rgFormatEtc : FORMATETC* -> Pointer<Void>
// lpAdviseSink : IAdviseSink* -> Pointer<Void>
// rgdwConnection : DWORD* out -> Pointer<Uint32>
// pClientSite : IOleClientSite* -> Pointer<Void>
// pStg : IStorage* -> Pointer<Void>
// ppvObj : void** out -> Pointer<Void>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function OleCreateLinkEx(
  pmkLinkSrc: Pointer;   // IMoniker*
  riid: PGUID;   // GUID*
  dwFlags: DWORD;   // OLECREATE
  renderopt: DWORD;   // DWORD
  cFormats: DWORD;   // DWORD
  rgAdvf: Pointer;   // DWORD*
  rgFormatEtc: Pointer;   // FORMATETC*
  lpAdviseSink: Pointer;   // IAdviseSink*
  rgdwConnection: Pointer;   // DWORD* out
  pClientSite: Pointer;   // IOleClientSite*
  pStg: Pointer;   // IStorage*
  ppvObj: Pointer   // void** out
): Integer; stdcall;
  external 'OLE32.dll' name 'OleCreateLinkEx';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "OleCreateLinkEx"
  c_OleCreateLinkEx :: Ptr () -> Ptr () -> Word32 -> Word32 -> Word32 -> Ptr Word32 -> Ptr () -> Ptr () -> Ptr Word32 -> Ptr () -> Ptr () -> Ptr () -> IO Int32
-- pmkLinkSrc : IMoniker* -> Ptr ()
-- riid : GUID* -> Ptr ()
-- dwFlags : OLECREATE -> Word32
-- renderopt : DWORD -> Word32
-- cFormats : DWORD -> Word32
-- rgAdvf : DWORD* -> Ptr Word32
-- rgFormatEtc : FORMATETC* -> Ptr ()
-- lpAdviseSink : IAdviseSink* -> Ptr ()
-- rgdwConnection : DWORD* out -> Ptr Word32
-- pClientSite : IOleClientSite* -> Ptr ()
-- pStg : IStorage* -> Ptr ()
-- ppvObj : void** out -> Ptr ()
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let olecreatelinkex =
  foreign "OleCreateLinkEx"
    ((ptr void) @-> (ptr void) @-> uint32_t @-> uint32_t @-> uint32_t @-> (ptr uint32_t) @-> (ptr void) @-> (ptr void) @-> (ptr uint32_t) @-> (ptr void) @-> (ptr void) @-> (ptr void) @-> returning int32_t)
(* pmkLinkSrc : IMoniker* -> (ptr void) *)
(* riid : GUID* -> (ptr void) *)
(* dwFlags : OLECREATE -> uint32_t *)
(* renderopt : DWORD -> uint32_t *)
(* cFormats : DWORD -> uint32_t *)
(* rgAdvf : DWORD* -> (ptr uint32_t) *)
(* rgFormatEtc : FORMATETC* -> (ptr void) *)
(* lpAdviseSink : IAdviseSink* -> (ptr void) *)
(* rgdwConnection : DWORD* out -> (ptr uint32_t) *)
(* pClientSite : IOleClientSite* -> (ptr void) *)
(* pStg : IStorage* -> (ptr void) *)
(* ppvObj : void** 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 ("OleCreateLinkEx" ole-create-link-ex :convention :stdcall) :int32
  (pmk-link-src :pointer)   ; IMoniker*
  (riid :pointer)   ; GUID*
  (dw-flags :uint32)   ; OLECREATE
  (renderopt :uint32)   ; DWORD
  (c-formats :uint32)   ; DWORD
  (rg-advf :pointer)   ; DWORD*
  (rg-format-etc :pointer)   ; FORMATETC*
  (lp-advise-sink :pointer)   ; IAdviseSink*
  (rgdw-connection :pointer)   ; DWORD* out
  (p-client-site :pointer)   ; IOleClientSite*
  (p-stg :pointer)   ; IStorage*
  (ppv-obj :pointer))   ; void** out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $OleCreateLinkEx = Win32::API::More->new('OLE32',
    'int OleCreateLinkEx(LPVOID pmkLinkSrc, LPVOID riid, DWORD dwFlags, DWORD renderopt, DWORD cFormats, LPVOID rgAdvf, LPVOID rgFormatEtc, LPVOID lpAdviseSink, LPVOID rgdwConnection, LPVOID pClientSite, LPVOID pStg, LPVOID ppvObj)');
# my $ret = $OleCreateLinkEx->Call($pmkLinkSrc, $riid, $dwFlags, $renderopt, $cFormats, $rgAdvf, $rgFormatEtc, $lpAdviseSink, $rgdwConnection, $pClientSite, $pStg, $ppvObj);
# pmkLinkSrc : IMoniker* -> LPVOID
# riid : GUID* -> LPVOID
# dwFlags : OLECREATE -> DWORD
# renderopt : DWORD -> DWORD
# cFormats : DWORD -> DWORD
# rgAdvf : DWORD* -> LPVOID
# rgFormatEtc : FORMATETC* -> LPVOID
# lpAdviseSink : IAdviseSink* -> LPVOID
# rgdwConnection : DWORD* out -> LPVOID
# pClientSite : IOleClientSite* -> LPVOID
# pStg : IStorage* -> LPVOID
# ppvObj : void** out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

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