一通り目を通してみましたが、
COMの仮想関数と思われるGetData()の実装方法が分かりません・・・。
IDropTargetインターフェース?のThunk.abpによる実装方法を見ると、
1、メソッドを実装したDropTargetImplクラスのインスタンスを作る。
この際に、DropTargetImplThunkクラスを継承しており、
それのvtableメンバが仮想関数の関数ポインタと
実装されたメソッドの関数ポインタを繋ぐ役割を果たす。
2、CreateDropTargetImpl()によって、上記のポインタ同士の
接続を行う。(vtableへの関数ポインタの代入?)
3、接続の終わったDropTargetImplクラスのポインタを
IDropTargetクラスのポインタへキャストする。
とすることで、
無理やり実装しているように思えました。
この理解があっているとすると、
ユーザーがインスタンスを作成するクラスであれば、
上記の方法で実装可能ですが、
IDataObjectのように、コールバックで生成される(?)クラスの
実装には使えないように思えます。
・・・それとも、具体的には、Drop関数の引数に与えられる
pDataObj As *IDataObject
が、vtableメンバを持っており、そこの4番目の要素に
実装したGetData()の関数のポインタを代入してから
利用すればよい、ということなのでしょうか?
(※最初の3つの要素はIUnknownと理解しています。)
と思ってやってみましたが、やっぱりダメですね・・・。
イグトランス様 さんが書きました:COMインターフェイスの実装にクラスを使うことはできないと思います。
この部分が最大のネックに感じました。
もっとも。
GetData()の実装方法が分かっても、
その実装コードの組み方自体もよく分からないという問題がまだありますが(汗)。
http://hp.vector.co.jp/authors/VA016117 ... drop3.html
あたりを見てはいますが・・・どのメンバにどういう形式でデータが
格納されているのかすら分からない・・・(困)。
どこかでCOMインターフェース自体の勉強してきてからじゃないとハードルが高過ぎるみたいです(苦笑)。
なお、Dropの部分は以下のように実装しようと思っています。
Drop関数に実装テスト中 [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
Function Drop(
/* [unique][in] */ ByVal pDataObj As *IDataObject,
/* [in] */ ByVal grfKeyState As DWord,
/* [in] */ ByVal x As Long, ByVal y As Long,
/* [out][in] */ ByRef effect As DWord) As HRESULT
OutputDebugString(Ex"Drop - ImplDropTarget\r\n")
' MessageBox(hwnd, "ドロップされました", "", MB_OK)
Dim rformatetcIn As FORMATETC
Dim pmedium As STGMEDIUM
Dim strBuf As String
Dim pAny As VoidPtr
rformatetcIn.cfFormat = CF_HDROP
rformatetcIn.ptd = NULL
rformatetcIn.dwAspect = DVASPECT_CONTENT
rformatetcIn.lindex = -1
rformatetcIn.tymed = TYMED_HGLOBAL
pAny = pDataObj->vtable
If( S_OK=pDataObj->GetData(rformatetcIn, pmedium) )Then
/* strBuf = ZeroString( MAX_PATH+1 )
DragQueryFile( pmedium.data As HDROP, 0 , StrPtr(strBuf), MAX_PATH )
ReleaseStgMedium( pmedium )
effect = DROPEFFECT_COPY
*/
End If
Debug 'strBufに格納されたかをチェック。
Drop = S_OK
End Function
上記のために追加した定数宣言など
コード: 全て選択
Declare Sub ReleaseStgMedium Lib "Ole32" ( ByRef pmedium As STGMEDIUM )
Const DVASPECT_CONTENT = 1
Const DVASPECT_THUMBNAIL = 2
Const DVASPECT_ICON = 4
Const DVASPECT_DOCPRINT = 8
Const TYMED_HGLOBAL = 1
Const TYMED_FILE = 2
Const TYMED_ISTREAM = 4
Const TYMED_ISTORAGE = 8
Const TYMED_GDI = 16
Const TYMED_MFPICT = 32
Const TYMED_ENHMF = 64
Const TYMED_NULL = 0
Const MK_ALT = &H20
Const DROPEFFECT_NONE = 0
Const DROPEFFECT_COPY = 1
Const DROPEFFECT_MOVE = 2
Const DROPEFFECT_LINK = 4
Const DROPEFFECT_SCROLL = &H80000000