(for Internet Explorer)
→ ドラッグ&ドロップWin3.1.txt
コピーかリンクか移動か拒否
テキスト形式です。日本語環境では、Shift-JIS 形式になります。
値=0x0001
ビットマップ形式です。
値=0x0002
Unicode のテキスト形式です。
値=0x000D
エクスプローラのファイルやフォルダです。
値=0x000F
DROPEFFECT (コピー、リンクなど)をドラッグ開始側で指定します。
値=RegisterClipboardFormat( "Preferred DropEffect" )
ファイル名です。 日本語環境では、Shift-JIS 形式になります。
値=RegisterClipboardFormat( "FileName" )
Unicode のファイル名です。
値=RegisterClipboardFormat( "FileNameW" )
URL です。 日本語環境では、Shift-JIS 形式になります。
値=RegisterClipboardFormat( "UniformResourceLocator" )
URL です。 Unicode 形式になります。
値=RegisterClipboardFormat( "UniformResourceLocatorW" )
HTML ソースです。
値=RegisterClipboardFormat( "HTML Format" )
CF_METAFILEPICT = 3
CF_SYLK = 4
CF_DIF = 5
CF_TIFF = 6
CF_OEMTEXT = 7
CF_DIB = 8
CF_PALETTE = 9
CF_PENDATA = 10
CF_RIFF = 11
CF_WAVE = 12
CF_ENHMETAFILE = 14
CF_LOCALE = 16
→ サンプル
→ サンプル(C:\lib フォルダ)
→ サンプル(C:\lib フォルダ、ktakeフォルダ)
→ エクスプローラとのドラッグ&ドロップ.svg
Shell IDList Array
Shell Object Offsets
DragImageBits
DragContext
InShellDragLoop
Shell IDList Array
Preferred DropEffect
InShellDragLoop
◆=他に無いもの
◇=組み合わせで他に無いもの
→ サンプル
→ サンプル
URL は取得できません。
→ サンプル
FileContents
… URL が入っています
… URL が入っています
UntrustedDragDrop
FileContents
cFileName に、テキスト + .url が入っている
◆=他に無いもの
◇=組み合わせで他に無いもの
cFileName に、タイトル + .url が入っている
#define     
DROPEFFECT_NONE    0
DROPEFFECT_COPY    1
DROPEFFECT_MOVE    2
DROPEFFECT_LINK    4
DROPEFFECT_SCROLL  0x80000000
ドラッグ&ドロップしたときに、オリジナルをコピーするか、移動するか、
拒否するかを識別します。
ドロップを拒否します
コピーします
移動します(オリジナルを削除します)
リンクを作成します
(*1)
(*1) COleDataSource::DoDragDrop で、ドラッグスクロールを許可します(?)
以下の関数で使われます。

CView::OnDragEnter
CView::OnDragOver
CView::OnDrop
型の名前 → 型の数値
型の数値 → 型の名前
データの種類を返します
データを取得します
UINT  RegisterClipboardFormat( TSTR* format );
アプリケーション独自のクリップボードの形式を文字列で指定し、識別に使う値を返します。
クリップボードの型の識別に使う値 0xC000〜0xFFFF
format は、大文字と小文字を区別しません。
同じ文字列を指定したら、同じ値が返ります。 ただし、OSを再起動すると変わる可能性はあります。
【引数】
format
返り値
クリップボードの型の名前
【補足】
int  GetClipboardFormatName( UINT num, TSTR* name, int name_size );
クリップボードの形式の数値から、形式の名前(文字列)を取得します。
(出力)クリップボードの名前を格納するアドレス
【引数】
num
name
クリップボードの型の識別に使う値
name_size
name のメモリサイズ(バイト)
成功=文字数、失敗=0
返り値
UINT  EnumClipboardFormats( UINT format );
クリップボードに入っているすべてのデータ形式を取得します。
【引数】
format
前回取得したデータ形式値、最初は 0
返り値
次のデータ形式値
CF_TEXT などの値や、
で取得できる値が返ります。
クリップボードには、複数の形式のデータが格納されていることが多いです。
次のサンプルように、すべてのデータ形式を調べて、動作内容を決定してください。
UINT  format;
bool  bTextFormat;

for ( format = EnumClipboardFormats( 0 );
      format != 0;
      format = EnumClipboardFormats( format ) ) {
  if ( format == CF_TEXT )  bTextFormat = true;
}
if ( GetLastError() != NO_ERROR )  error();

if ( bText ) { GetClipboardData ... }
サンプル
HANDLE  GetClipboardData( UINT format );
クリップボードにあるデータのうち、指定の形式のデータのハンドルを取得します。
UINT    format;
HANDLE  data;

format = EnumClipboardFormats ...

data = GetClipboardData( format );
size = GlobalSize( data );
p = (char*)GlobalLock( data );
p;  // ここでデータにアクセスする
GlobalUnlock( data );
EnumClipboardFormats で取得できるデータ形式値
format
【引数】
返り値
データのハンドル
サンプル
返り値は、下記サンプルのように、GlobalLock してからアクセスできます。
HGLOBAL  GlobalAlloc( UINT flags, size_t size );
flags
通常 0
【引数】
size
グローバルメモリ(他のプロセスからでもアクセスできるメモリ領域)を確保します。
確保するメモリサイズ(バイト)
返り値
グローバルメモリへのハンドル
【補足】
確保したメモリ領域は、返り値を
して初めてアクセスできます。
使わなくなったら、返り値を
してください。
HGLOBAL  GlobalFree( HGLOBAL mem );
mem
【引数】
で確保した、グローバルメモリを開放します。
返り値
グローバルメモリへのハンドル
成功=NULL
void*  GlobalLock( HGLOBAL mem );
mem
【引数】
グローバルメモリへのアクセスを開始します。
返り値
グローバルメモリへのハンドル
グローバルメモリにアクセスできるアドレス
【補足】
使わなくなったら、mem 引数を
してください。
アクセスできる範囲は、
から分かります。
BOOL  GlobalUnlock( HGLOBAL mem );
mem
【引数】
で開始した、グローバルメモリへのアクセスを終了します。
返り値
グローバルメモリへのハンドル
成功 = NO_ERROR
DWORD  GlobalSize( HGLOBAL mem );
mem
【引数】
で確保した、グローバルメモリのサイズを返します。
返り値
グローバルメモリへのハンドル
グローバルメモリのサイズ(バイト)
GetData
GetDataHere
QueryGetData
GetCanonicalFormatEtc
SetData
EnumFormatEtc
DAdvise
DUnadvise
EnumDAdvise
QueryContinueDrag
GiveFeedback
DragEnter
DragOver
DragLeave
Drop
RegisterDragDrop
RevokeDragDrop
(Createで)ドロップの受付を開始する
(Destroyで)ドロップの受付を終了する
IDropTarget
パラメータは、
IDataObject と
マウス座標
IDataObject
IDropSource
IDropTarget::DragOver で、
*pdwEffect = DROPEFFECT_COPY;
*pdwEffect = DROPEFFECT_LINK;
によって、IEからドラッグしたときの
CF_TEXT フォーマットデータの内容が
変わる。
ドラッグ中の反応、親はウィンドウクラス?
ドラッグ中や後の反応、親はウィンドウクラス
データ
開始側と受け側
CView::OnDragOver
ドラッグカーソルが動いたとき
CView::OnDragLeave
ドラッグカーソルが出たとき
CView::OnDrop
ドロップしたとき
CView::OnDragEnter でデータの種類を調べて、DROPEFFECT(コピーするか移動するか受け付け
ないか)を判定します。 データの種類と判定した結果は変数に確保しておき、CView::OnDragOver や
CView::OnDrop で再利用します。 CView::OnDrop で、データを取得します。
COleDataSource::DoDragDrop
CLIPFORMAT  m_DropType;
DROPEFFECT  m_DropEffectDef;
DROPEFFECT  m_DropEffectMask;


DROPEFFECT CView::OnDragEnter( COleDataObject* pDataObject, DWORD KeyState, CPoint point )
{
  bool  bTextFormat, bFileFormat;

  /* 種類の存在を確認する */
  pDataObject->BeginEnumFormats();
  while ( pDataObject->GetNextFormat( &f ) ) {
    if ( f.cfFormat == CF_TEXT )  bTextFormat = true;
    if ( f.cfFormat == CF_HDROP )  bFileFormat = true;
  }

  /* 種類の存在から対応する処理のタイプを決める */
  if ( bTextFormat )  m_DropType = CF_TEXT;

  /* effect(コピーか移動か拒否か)のデフォルトとマスクを設定する */
  switch ( m_DropType ) {
    case  CF_TEXT:
      m_DropEffectDef = DROPEFFECT_MOVE;
      m_DropEffectMask = DROPEFFECT_MOVE | DROPEFFECT_COPY;
      break;
    default:
      m_DropEffectDef = DROPEFFECT_NONE;
      m_DropEffectMask = 0;
      break;
  }

  /* 現在の effect を返す(CView::OnDragOver でも同様に) */
  switch ( dwKeyState & (MK_CONTROL | MK_SHIFT) ) {
    case  MK_SHIFT:    ret = DROPEFFECT_MOVE;  break;
    case  MK_CONTROL:  ret = DROPEFFECT_COPY;  break;
    case  ( MK_SHIFT | MK_CONTROL ):
                       ret = DROPEFFECT_LINK;  break;
    case  default:     ret = m_DropEffectDef;  break;
  }
  if ( ( ret & m_DropEffectMask ) == 0 )
    ret = m_DropEffectDef;

  return  ret;
}
typedef struct tagFORMATETC {
    CLIPFORMAT cfFormat;
    DVTARGETDEVICE * ptd;
    DWORD dwAspect;
    LONG lindex;
    DWORD tymed;
} FORMATETC, *LPFORMATETC;
OLEデータの型を識別する構造体です。
EnumClipboardFormats で取得できる形式の値
不明
FILEGROUPDESCRIPTOR
typedef struct _FILEGROUPDESCRIPTOR {
    UINT cItems;
    FILEDESCRIPTOR fgd[1];
} FILEGROUPDESCRIPTOR, *LPFILEGROUPDESCRIPTOR;
shlobj.h
typedef struct _FILEDESCRIPTOR {
    DWORD    dwFlags;
    CLSID    clsid;
    SIZEL    sizel;
    POINTL   pointl;
    DWORD    dwFileAttributes;
    FILETIME ftCreationTime;
    FILETIME ftLastAccessTime;
    FILETIME ftLastWriteTime;
    DWORD    nFileSizeHigh;
    DWORD    nFileSizeLow;
    TCHAR    cFileName[MAX_PATH];
} FILEDESCRIPTOR, *LPFILEDESCRIPTOR;
shlobj.h
FD_ACCESSTIME
FD_ATTRIBUTES
FD_CLSID
FD_CREATETIME
FD_FILESIZE
FD_LINKUI
FD_PROGRESSUI
FD_SIZEPOINT
FD_WRITESTIME
dwFlags の詳細
(cache)
ドラッグ & ドロップしてダウンロードしたファイルが、スタートアップフォルダにできてしまう脆弱性です。
おそらく、コードの不具合により、ドロップ先のアドレスを変えてしまうカラクリがあると思われます。