OleCreateLinkFromDataEx
関数シグネチャ
// OLE32.dll
#include <windows.h>
HRESULT OleCreateLinkFromDataEx(
IDataObject* pSrcDataObj,
const GUID* riid,
OLECREATE dwFlags,
DWORD renderopt,
DWORD cFormats,
DWORD* rgAdvf,
FORMATETC* rgFormatEtc,
IAdviseSink* lpAdviseSink,
DWORD* rgdwConnection,
IOleClientSite* pClientSite,
IStorage* pStg,
void** ppvObj
);パラメーター
| 名前 | 型 | 方向 | 説明 |
|---|---|---|---|
| pSrcDataObj | IDataObject* | in | リンクオブジェクトの作成元となるデータオブジェクトへのポインター。 |
| riid | GUID* | in | 返すオブジェクトのインターフェイスの識別子への参照。 |
| dwFlags | OLECREATE | in | このパラメーターには 0 または OLECREATE_LEAVERUNNING (0x00000001) を指定できます。 |
| renderopt | DWORD | in | OLERENDER 列挙体から取得した値。 |
| cFormats | DWORD | in | renderopt が OLERENDER_FORMAT の場合、rgFormatEtc 配列内の FORMATETC 構造体の数を示します。これは少なくとも 1 でなければなりません。それ以外の場合、このパラメーターは 0 でなければなりません。 |
| rgAdvf | DWORD* | in | renderopt が OLERENDER_FORMAT の場合、DWORD 要素の配列を指します。各要素は ADVF 列挙体の値の組み合わせです。この配列の各要素は、pAdviseSink が NULL であるか非 NULL であるかに応じて、IOleCache::Cache または IDataObject::DAdvise のいずれかの呼び出しに advf パラメーターとして渡されます (下記参照)。それ以外の場合、このパラメーターは NULL でなければなりません。 |
| rgFormatEtc | FORMATETC* | in | renderopt が OLERENDER_FORMAT の場合、FORMATETC 構造体の配列を指します。pAdviseSink が NULL の場合、この配列の各要素はオブジェクトの IOleCache::Cache の呼び出しに pFormatEtc パラメーターとして渡されます。これにより、オブジェクトのインプロセスハンドラー (通常は既定のハンドラー) によって管理されるデータおよび表示キャッシュに、表示データやその他のキャッシュ可能なデータが格納されます。pAdviseSink が非 NULL の場合、この配列の各要素は IDataObject::DAdvise の呼び出しに pFormatEtc パラメーターとして渡されます。これにより、呼び出し元 (通常は OLE コンテナー) は、オブジェクトから受け取ったデータの独自のキャッシュや処理を行うことができます。 |
| lpAdviseSink | IAdviseSink* | in | renderopt が OLERENDER_FORMAT の場合、データ アドバイズの独自のキャッシュや処理を示す有効な IAdviseSink ポインター、または既定のデータ形式キャッシュを示す NULL のいずれかを指定できます。 |
| rgdwConnection | DWORD* | inout | IDataObject::DAdvise を使用して各アドバイザリ接続に pAdviseSink インターフェイスが登録されたときに返される dwConnection 値の配列を返す場所。返されるアドバイザリ接続が不要な場合は NULL を指定します。pAdviseSink が NULL の場合、このパラメーターは NULL でなければなりません。 |
| pClientSite | IOleClientSite* | in | オブジェクトがコンテナーにサービスを要求する際に使用する主要なインターフェイスへのポインター。このパラメーターには NULL を指定できます。その場合、呼び出し元は IOleObject::SetClientSite を使用してできるだけ早くクライアントサイトを確立する責任があります。 |
| pStg | IStorage* | in | オブジェクト、およびそのオブジェクトに対して確立された既定のデータ キャッシュや表示キャッシュに使用するストレージへのポインター。 |
| ppvObj | void** | out | riid で要求されたインターフェイスポインターを受け取る出力ポインター変数のアドレス。正常に復帰すると、*ppvObj には新しく作成されたオブジェクト上の要求されたインターフェイスポインターが格納されます。 |
戻り値の型: HRESULT
公式ドキュメント
OleCreateLinkFromData の機能を拡張し、OleCreateLinkFromData がサポートする単一形式ではなく、複数の表示形式やデータ形式のキャッシュを必要とするコンテナーにおいて、オブジェクトをより効率的にインスタンス化できるようにします。
戻り値
この関数は成功時に S_OK を返します。その他に返される可能性のある値には次のものがあります。
| 戻り値 | 説明 |
|---|---|
| 指定されたインターフェイス識別子が無効です。 | |
| 1 つ以上のパラメーターが無効です。 |
解説(Remarks)
次の OleCreateLinkFromData の呼び出し:
OleCreateLinkFromData(pSrcDataObj, riid, renderopt, pFormatEtc, pClientSite, pStg, ppvObj);
は、次の OleCreateLinkFromDataEx の呼び出しと同等です:
DWORD advf = ADVF_PRIMEFIRST;
OleCreateLinkFromDataEx(pSrcDataObj, riid, renderopt, 1, &advf, pFormatEtc, NULL, NULL, pClientSite, pStg, ppvObj);
既存のインスタンス化関数 (OleCreate、OleCreateFromFile、OleCreateFromData、OleCreateLink、OleCreateLinkToFile、および OleCreateLinkFromData) は、インスタンス化の際に既定のキャッシュ場所 (渡された IStorage の '\001OlePresXXX' ストリーム内) に単一の表示形式またはデータ形式のキャッシュのみを作成します。さらに、これらのキャッシュはオブジェクトが次に実行状態に入るときに作成される必要があります。ほとんどのアプリケーションは少なくとも 2 つの表示形式 (画面用とプリンター用) のキャッシュを必要とし、ハンドラーとは異なる形式や場所でのデータのキャッシュを必要とする場合もあるため、アプリケーションはオブジェクトの作成時 (Insert Object、Insert Object from File、Paste Object) にデータキャッシュを準備するために、オブジェクトサーバーを通常複数回起動および終了する必要があります。
これらの作成関数の拡張版はこの問題を解決します。OleCreateEx、OleCreateFromFileEx、OleCreateFromDataEx、OleCreateLinkEx、OleCreateLinkToFileEx、および OleCreateLinkFromDataEx には、次の新しいパラメーターが含まれます: 追加オプションを示す dwFlags、キャッシュする形式の数を示す cFormats、キャッシュする各形式のアドバイズフラグを指定する ADVF 列挙体由来の rgAdvf、表示形式 (既定ハンドラー) のキャッシュとデータ (非既定ハンドラー) のキャッシュのどちらが必要かを示す pAdviseSink、IDataObject::DAdvise のクッキーを返す rgdwConnection、および単一の形式ではなく形式の配列である rgFormatEtc。
オブジェクトのハンドラーによって複数の表示形式を自分の代わりにキャッシュさせる必要があるコンテナーは、これらの関数を呼び出し、cFormats に形式の数、rgAdvf に各形式の ADVF フラグ、rgFormatEtc に形式のセットを指定するだけで済みます。これらのコンテナーは pAdviseSink に NULL を渡します。
すべてのデータ キャッシュまたは表示キャッシュを自分自身で行うコンテナーは、これらと同じ手順を実行しますが、非 NULL の pAdviseSink を渡します。それらは IAdviseSink::OnDataChange の際にオブジェクトまたはデータの独自のキャッシュや操作を実行します。通常、このようなコンテナーが ADVF_NODATA でアドバイザリ接続を確立することはありませんが、そうすることが禁止されているわけではありません。
これらの新しい関数は OLE 複合ドキュメント向けです。これらの関数を使用すると、アプリケーションは現在の関数で必要となる繰り返しの起動および初期化の手順を回避できます。これらは、既定のデータ キャッシュおよび表示キャッシュを使用する OLE 複合ドキュメントのコンテナーアプリケーション、ならびに基盤となる IDataObject::DAdvise サポートから独自のキャッシュおよびデータ転送を提供するアプリケーションを対象としています。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での呼び出し定義
// OLE32.dll
#include <windows.h>
HRESULT OleCreateLinkFromDataEx(
IDataObject* pSrcDataObj,
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 OleCreateLinkFromDataEx(
IntPtr pSrcDataObj, // IDataObject*
ref Guid riid, // GUID*
uint dwFlags, // OLECREATE
uint renderopt, // DWORD
uint cFormats, // DWORD
ref uint rgAdvf, // DWORD*
IntPtr rgFormatEtc, // FORMATETC*
IntPtr lpAdviseSink, // IAdviseSink*
ref uint rgdwConnection, // DWORD* in/out
IntPtr pClientSite, // IOleClientSite*
IntPtr pStg, // IStorage*
IntPtr ppvObj // void** out
);<DllImport("OLE32.dll", ExactSpelling:=True)>
Public Shared Function OleCreateLinkFromDataEx(
pSrcDataObj As IntPtr, ' IDataObject*
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*
ByRef rgdwConnection As UInteger, ' DWORD* in/out
pClientSite As IntPtr, ' IOleClientSite*
pStg As IntPtr, ' IStorage*
ppvObj As IntPtr ' void** out
) As Integer
End Function' pSrcDataObj : IDataObject*
' riid : GUID*
' dwFlags : OLECREATE
' renderopt : DWORD
' cFormats : DWORD
' rgAdvf : DWORD*
' rgFormatEtc : FORMATETC*
' lpAdviseSink : IAdviseSink*
' rgdwConnection : DWORD* in/out
' pClientSite : IOleClientSite*
' pStg : IStorage*
' ppvObj : void** out
Declare PtrSafe Function OleCreateLinkFromDataEx Lib "ole32" ( _
ByVal pSrcDataObj 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
OleCreateLinkFromDataEx = ctypes.windll.ole32.OleCreateLinkFromDataEx
OleCreateLinkFromDataEx.restype = ctypes.c_int
OleCreateLinkFromDataEx.argtypes = [
ctypes.c_void_p, # pSrcDataObj : IDataObject*
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* in/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')
OleCreateLinkFromDataEx = Fiddle::Function.new(
lib['OleCreateLinkFromDataEx'],
[
Fiddle::TYPE_VOIDP, # pSrcDataObj : IDataObject*
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* in/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 OleCreateLinkFromDataEx(
pSrcDataObj: *mut core::ffi::c_void, // IDataObject*
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* in/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 OleCreateLinkFromDataEx(IntPtr pSrcDataObj, ref Guid riid, uint dwFlags, uint renderopt, uint cFormats, ref uint rgAdvf, IntPtr rgFormatEtc, IntPtr lpAdviseSink, ref uint rgdwConnection, IntPtr pClientSite, IntPtr pStg, IntPtr ppvObj);
"@
$api = Add-Type -MemberDefinition $sig -Name 'OLE32_OleCreateLinkFromDataEx' -Namespace Win32 -PassThru
# $api::OleCreateLinkFromDataEx(pSrcDataObj, riid, dwFlags, renderopt, cFormats, rgAdvf, rgFormatEtc, lpAdviseSink, rgdwConnection, pClientSite, pStg, ppvObj)#uselib "OLE32.dll"
#func global OleCreateLinkFromDataEx "OleCreateLinkFromDataEx" sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr
; OleCreateLinkFromDataEx pSrcDataObj, varptr(riid), dwFlags, renderopt, cFormats, varptr(rgAdvf), varptr(rgFormatEtc), lpAdviseSink, varptr(rgdwConnection), pClientSite, pStg, ppvObj ; 戻り値は stat
; pSrcDataObj : IDataObject* -> "sptr"
; riid : GUID* -> "sptr"
; dwFlags : OLECREATE -> "sptr"
; renderopt : DWORD -> "sptr"
; cFormats : DWORD -> "sptr"
; rgAdvf : DWORD* -> "sptr"
; rgFormatEtc : FORMATETC* -> "sptr"
; lpAdviseSink : IAdviseSink* -> "sptr"
; rgdwConnection : DWORD* in/out -> "sptr"
; pClientSite : IOleClientSite* -> "sptr"
; pStg : IStorage* -> "sptr"
; ppvObj : void** out -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。#uselib "OLE32.dll" #cfunc global OleCreateLinkFromDataEx "OleCreateLinkFromDataEx" sptr, var, int, int, int, var, var, sptr, var, sptr, sptr, sptr ; res = OleCreateLinkFromDataEx(pSrcDataObj, riid, dwFlags, renderopt, cFormats, rgAdvf, rgFormatEtc, lpAdviseSink, rgdwConnection, pClientSite, pStg, ppvObj) ; pSrcDataObj : IDataObject* -> "sptr" ; riid : GUID* -> "var" ; dwFlags : OLECREATE -> "int" ; renderopt : DWORD -> "int" ; cFormats : DWORD -> "int" ; rgAdvf : DWORD* -> "var" ; rgFormatEtc : FORMATETC* -> "var" ; lpAdviseSink : IAdviseSink* -> "sptr" ; rgdwConnection : DWORD* in/out -> "var" ; pClientSite : IOleClientSite* -> "sptr" ; pStg : IStorage* -> "sptr" ; ppvObj : void** out -> "sptr" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。#uselib "OLE32.dll" #cfunc global OleCreateLinkFromDataEx "OleCreateLinkFromDataEx" sptr, sptr, int, int, int, sptr, sptr, sptr, sptr, sptr, sptr, sptr ; res = OleCreateLinkFromDataEx(pSrcDataObj, varptr(riid), dwFlags, renderopt, cFormats, varptr(rgAdvf), varptr(rgFormatEtc), lpAdviseSink, varptr(rgdwConnection), pClientSite, pStg, ppvObj) ; pSrcDataObj : IDataObject* -> "sptr" ; riid : GUID* -> "sptr" ; dwFlags : OLECREATE -> "int" ; renderopt : DWORD -> "int" ; cFormats : DWORD -> "int" ; rgAdvf : DWORD* -> "sptr" ; rgFormatEtc : FORMATETC* -> "sptr" ; lpAdviseSink : IAdviseSink* -> "sptr" ; rgdwConnection : DWORD* in/out -> "sptr" ; pClientSite : IOleClientSite* -> "sptr" ; pStg : IStorage* -> "sptr" ; ppvObj : void** out -> "sptr" ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。
; HRESULT OleCreateLinkFromDataEx(IDataObject* pSrcDataObj, 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 OleCreateLinkFromDataEx "OleCreateLinkFromDataEx" intptr, var, int, int, int, var, var, intptr, var, intptr, intptr, intptr ; res = OleCreateLinkFromDataEx(pSrcDataObj, riid, dwFlags, renderopt, cFormats, rgAdvf, rgFormatEtc, lpAdviseSink, rgdwConnection, pClientSite, pStg, ppvObj) ; pSrcDataObj : IDataObject* -> "intptr" ; riid : GUID* -> "var" ; dwFlags : OLECREATE -> "int" ; renderopt : DWORD -> "int" ; cFormats : DWORD -> "int" ; rgAdvf : DWORD* -> "var" ; rgFormatEtc : FORMATETC* -> "var" ; lpAdviseSink : IAdviseSink* -> "intptr" ; rgdwConnection : DWORD* in/out -> "var" ; pClientSite : IOleClientSite* -> "intptr" ; pStg : IStorage* -> "intptr" ; ppvObj : void** out -> "intptr" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。; HRESULT OleCreateLinkFromDataEx(IDataObject* pSrcDataObj, 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 OleCreateLinkFromDataEx "OleCreateLinkFromDataEx" intptr, intptr, int, int, int, intptr, intptr, intptr, intptr, intptr, intptr, intptr ; res = OleCreateLinkFromDataEx(pSrcDataObj, varptr(riid), dwFlags, renderopt, cFormats, varptr(rgAdvf), varptr(rgFormatEtc), lpAdviseSink, varptr(rgdwConnection), pClientSite, pStg, ppvObj) ; pSrcDataObj : IDataObject* -> "intptr" ; riid : GUID* -> "intptr" ; dwFlags : OLECREATE -> "int" ; renderopt : DWORD -> "int" ; cFormats : DWORD -> "int" ; rgAdvf : DWORD* -> "intptr" ; rgFormatEtc : FORMATETC* -> "intptr" ; lpAdviseSink : IAdviseSink* -> "intptr" ; rgdwConnection : DWORD* in/out -> "intptr" ; pClientSite : IOleClientSite* -> "intptr" ; pStg : IStorage* -> "intptr" ; ppvObj : void** out -> "intptr" ; ※出力/バッファ引数はポインタ方式(token=intptr / 呼び出しは varptr(変数))。
import (
"golang.org/x/sys/windows"
"unsafe"
)
var (
ole32 = windows.NewLazySystemDLL("OLE32.dll")
procOleCreateLinkFromDataEx = ole32.NewProc("OleCreateLinkFromDataEx")
)
// pSrcDataObj (IDataObject*), riid (GUID*), dwFlags (OLECREATE), renderopt (DWORD), cFormats (DWORD), rgAdvf (DWORD*), rgFormatEtc (FORMATETC*), lpAdviseSink (IAdviseSink*), rgdwConnection (DWORD* in/out), pClientSite (IOleClientSite*), pStg (IStorage*), ppvObj (void** out)
r1, _, err := procOleCreateLinkFromDataEx.Call(
uintptr(pSrcDataObj),
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 // HRESULTfunction OleCreateLinkFromDataEx(
pSrcDataObj: Pointer; // IDataObject*
riid: PGUID; // GUID*
dwFlags: DWORD; // OLECREATE
renderopt: DWORD; // DWORD
cFormats: DWORD; // DWORD
rgAdvf: Pointer; // DWORD*
rgFormatEtc: Pointer; // FORMATETC*
lpAdviseSink: Pointer; // IAdviseSink*
rgdwConnection: Pointer; // DWORD* in/out
pClientSite: Pointer; // IOleClientSite*
pStg: Pointer; // IStorage*
ppvObj: Pointer // void** out
): Integer; stdcall;
external 'OLE32.dll' name 'OleCreateLinkFromDataEx';result := DllCall("OLE32\OleCreateLinkFromDataEx"
, "Ptr", pSrcDataObj ; IDataObject*
, "Ptr", riid ; GUID*
, "UInt", dwFlags ; OLECREATE
, "UInt", renderopt ; DWORD
, "UInt", cFormats ; DWORD
, "Ptr", rgAdvf ; DWORD*
, "Ptr", rgFormatEtc ; FORMATETC*
, "Ptr", lpAdviseSink ; IAdviseSink*
, "Ptr", rgdwConnection ; DWORD* in/out
, "Ptr", pClientSite ; IOleClientSite*
, "Ptr", pStg ; IStorage*
, "Ptr", ppvObj ; void** out
, "Int") ; return: HRESULT●OleCreateLinkFromDataEx(pSrcDataObj, riid, dwFlags, renderopt, cFormats, rgAdvf, rgFormatEtc, lpAdviseSink, rgdwConnection, pClientSite, pStg, ppvObj) = DLL("OLE32.dll", "int OleCreateLinkFromDataEx(void*, void*, dword, dword, dword, void*, void*, void*, void*, void*, void*, void*)")
# 呼び出し: OleCreateLinkFromDataEx(pSrcDataObj, riid, dwFlags, renderopt, cFormats, rgAdvf, rgFormatEtc, lpAdviseSink, rgdwConnection, pClientSite, pStg, ppvObj)
# pSrcDataObj : IDataObject* -> "void*"
# riid : GUID* -> "void*"
# dwFlags : OLECREATE -> "dword"
# renderopt : DWORD -> "dword"
# cFormats : DWORD -> "dword"
# rgAdvf : DWORD* -> "void*"
# rgFormatEtc : FORMATETC* -> "void*"
# lpAdviseSink : IAdviseSink* -> "void*"
# rgdwConnection : DWORD* in/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 OleCreateLinkFromDataEx(
pSrcDataObj: ?*anyopaque, // IDataObject*
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* in/out
pClientSite: ?*anyopaque, // IOleClientSite*
pStg: ?*anyopaque, // IStorage*
ppvObj: ?*anyopaque // void** out
) callconv(std.os.windows.WINAPI) i32;proc OleCreateLinkFromDataEx(
pSrcDataObj: pointer, # IDataObject*
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* in/out
pClientSite: pointer, # IOleClientSite*
pStg: pointer, # IStorage*
ppvObj: pointer # void** out
): int32 {.importc: "OleCreateLinkFromDataEx", stdcall, dynlib: "OLE32.dll".}pragma(lib, "ole32");
extern(Windows)
int OleCreateLinkFromDataEx(
void* pSrcDataObj, // IDataObject*
GUID* riid, // GUID*
uint dwFlags, // OLECREATE
uint renderopt, // DWORD
uint cFormats, // DWORD
uint* rgAdvf, // DWORD*
FORMATETC* rgFormatEtc, // FORMATETC*
void* lpAdviseSink, // IAdviseSink*
uint* rgdwConnection, // DWORD* in/out
void* pClientSite, // IOleClientSite*
void* pStg, // IStorage*
void** ppvObj // void** out
);ccall((:OleCreateLinkFromDataEx, "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}),
pSrcDataObj, riid, dwFlags, renderopt, cFormats, rgAdvf, rgFormatEtc, lpAdviseSink, rgdwConnection, pClientSite, pStg, ppvObj)
# pSrcDataObj : IDataObject* -> 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* in/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 OleCreateLinkFromDataEx(
void* pSrcDataObj,
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.OleCreateLinkFromDataEx(pSrcDataObj, riid, dwFlags, renderopt, cFormats, rgAdvf, rgFormatEtc, lpAdviseSink, rgdwConnection, pClientSite, pStg, ppvObj)
-- pSrcDataObj : IDataObject*
-- riid : GUID*
-- dwFlags : OLECREATE
-- renderopt : DWORD
-- cFormats : DWORD
-- rgAdvf : DWORD*
-- rgFormatEtc : FORMATETC*
-- lpAdviseSink : IAdviseSink*
-- rgdwConnection : DWORD* in/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 OleCreateLinkFromDataEx = lib.func('__stdcall', 'OleCreateLinkFromDataEx', 'int32_t', ['void *', 'void *', 'uint32_t', 'uint32_t', 'uint32_t', 'uint32_t *', 'void *', 'void *', 'uint32_t *', 'void *', 'void *', 'void *']);
// OleCreateLinkFromDataEx(pSrcDataObj, riid, dwFlags, renderopt, cFormats, rgAdvf, rgFormatEtc, lpAdviseSink, rgdwConnection, pClientSite, pStg, ppvObj)
// pSrcDataObj : IDataObject* -> '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* in/out -> 'uint32_t *'
// pClientSite : IOleClientSite* -> 'void *'
// pStg : IStorage* -> 'void *'
// ppvObj : void** out -> 'void *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。const lib = Deno.dlopen("OLE32.dll", {
OleCreateLinkFromDataEx: { parameters: ["pointer", "pointer", "u32", "u32", "u32", "pointer", "pointer", "pointer", "pointer", "pointer", "pointer", "pointer"], result: "i32" },
});
// lib.symbols.OleCreateLinkFromDataEx(pSrcDataObj, riid, dwFlags, renderopt, cFormats, rgAdvf, rgFormatEtc, lpAdviseSink, rgdwConnection, pClientSite, pStg, ppvObj)
// pSrcDataObj : IDataObject* -> "pointer"
// riid : GUID* -> "pointer"
// dwFlags : OLECREATE -> "u32"
// renderopt : DWORD -> "u32"
// cFormats : DWORD -> "u32"
// rgAdvf : DWORD* -> "pointer"
// rgFormatEtc : FORMATETC* -> "pointer"
// lpAdviseSink : IAdviseSink* -> "pointer"
// rgdwConnection : DWORD* in/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 OleCreateLinkFromDataEx(
void* pSrcDataObj,
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->OleCreateLinkFromDataEx(pSrcDataObj, riid, dwFlags, renderopt, cFormats, rgAdvf, rgFormatEtc, lpAdviseSink, rgdwConnection, pClientSite, pStg, ppvObj);
// pSrcDataObj : IDataObject*
// riid : GUID*
// dwFlags : OLECREATE
// renderopt : DWORD
// cFormats : DWORD
// rgAdvf : DWORD*
// rgFormatEtc : FORMATETC*
// lpAdviseSink : IAdviseSink*
// rgdwConnection : DWORD* in/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 OleCreateLinkFromDataEx(
Pointer pSrcDataObj, // IDataObject*
Pointer riid, // GUID*
int dwFlags, // OLECREATE
int renderopt, // DWORD
int cFormats, // DWORD
IntByReference rgAdvf, // DWORD*
Pointer rgFormatEtc, // FORMATETC*
Pointer lpAdviseSink, // IAdviseSink*
IntByReference rgdwConnection, // DWORD* in/out
Pointer pClientSite, // IOleClientSite*
Pointer pStg, // IStorage*
Pointer ppvObj // void** out
);
}@[Link("ole32")]
lib LibOLE32
fun OleCreateLinkFromDataEx = OleCreateLinkFromDataEx(
pSrcDataObj : Void*, # IDataObject*
riid : GUID*, # GUID*
dwFlags : UInt32, # OLECREATE
renderopt : UInt32, # DWORD
cFormats : UInt32, # DWORD
rgAdvf : UInt32*, # DWORD*
rgFormatEtc : FORMATETC*, # FORMATETC*
lpAdviseSink : Void*, # IAdviseSink*
rgdwConnection : UInt32*, # DWORD* in/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 OleCreateLinkFromDataExNative = Int32 Function(Pointer<Void>, Pointer<Void>, Uint32, Uint32, Uint32, Pointer<Uint32>, Pointer<Void>, Pointer<Void>, Pointer<Uint32>, Pointer<Void>, Pointer<Void>, Pointer<Void>);
typedef OleCreateLinkFromDataExDart = int Function(Pointer<Void>, Pointer<Void>, int, int, int, Pointer<Uint32>, Pointer<Void>, Pointer<Void>, Pointer<Uint32>, Pointer<Void>, Pointer<Void>, Pointer<Void>);
final OleCreateLinkFromDataEx = DynamicLibrary.open('OLE32.dll')
.lookupFunction<OleCreateLinkFromDataExNative, OleCreateLinkFromDataExDart>('OleCreateLinkFromDataEx');
// pSrcDataObj : IDataObject* -> 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* in/out -> Pointer<Uint32>
// pClientSite : IOleClientSite* -> Pointer<Void>
// pStg : IStorage* -> Pointer<Void>
// ppvObj : void** out -> Pointer<Void>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。{$mode objfpc}{$H+}
function OleCreateLinkFromDataEx(
pSrcDataObj: Pointer; // IDataObject*
riid: PGUID; // GUID*
dwFlags: DWORD; // OLECREATE
renderopt: DWORD; // DWORD
cFormats: DWORD; // DWORD
rgAdvf: Pointer; // DWORD*
rgFormatEtc: Pointer; // FORMATETC*
lpAdviseSink: Pointer; // IAdviseSink*
rgdwConnection: Pointer; // DWORD* in/out
pClientSite: Pointer; // IOleClientSite*
pStg: Pointer; // IStorage*
ppvObj: Pointer // void** out
): Integer; stdcall;
external 'OLE32.dll' name 'OleCreateLinkFromDataEx';import Foreign
import Foreign.C.Types
import Foreign.C.String
foreign import stdcall safe "OleCreateLinkFromDataEx"
c_OleCreateLinkFromDataEx :: Ptr () -> Ptr () -> Word32 -> Word32 -> Word32 -> Ptr Word32 -> Ptr () -> Ptr () -> Ptr Word32 -> Ptr () -> Ptr () -> Ptr () -> IO Int32
-- pSrcDataObj : IDataObject* -> 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* in/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 olecreatelinkfromdataex =
foreign "OleCreateLinkFromDataEx"
((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)
(* pSrcDataObj : IDataObject* -> (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* in/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 ("OleCreateLinkFromDataEx" ole-create-link-from-data-ex :convention :stdcall) :int32
(p-src-data-obj :pointer) ; IDataObject*
(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* in/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 $OleCreateLinkFromDataEx = Win32::API::More->new('OLE32',
'int OleCreateLinkFromDataEx(LPVOID pSrcDataObj, LPVOID riid, DWORD dwFlags, DWORD renderopt, DWORD cFormats, LPVOID rgAdvf, LPVOID rgFormatEtc, LPVOID lpAdviseSink, LPVOID rgdwConnection, LPVOID pClientSite, LPVOID pStg, LPVOID ppvObj)');
# my $ret = $OleCreateLinkFromDataEx->Call($pSrcDataObj, $riid, $dwFlags, $renderopt, $cFormats, $rgAdvf, $rgFormatEtc, $lpAdviseSink, $rgdwConnection, $pClientSite, $pStg, $ppvObj);
# pSrcDataObj : IDataObject* -> LPVOID
# riid : GUID* -> LPVOID
# dwFlags : OLECREATE -> DWORD
# renderopt : DWORD -> DWORD
# cFormats : DWORD -> DWORD
# rgAdvf : DWORD* -> LPVOID
# rgFormatEtc : FORMATETC* -> LPVOID
# lpAdviseSink : IAdviseSink* -> LPVOID
# rgdwConnection : DWORD* in/out -> LPVOID
# pClientSite : IOleClientSite* -> LPVOID
# pStg : IStorage* -> LPVOID
# ppvObj : void** out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。関連項目
- f OleCreateLinkFromData — データオブジェクトからリンク埋め込みオブジェクトを作成する。
- f OleCreate — 指定したCLSIDの新しい埋め込みOLEオブジェクトを作成する。