C++/MFCからC#/WPFへドラッグアンドドロップするには
C++/MFCのプログラムからC#/WPFのプログラムにドラッグアンドドロップでデータを渡すにはどうするのがよいでしょうか。現在以下のようなコードで、C#側でDragEventArgs
にデータが入っているのまで確認できたのですがうまく取り出せません。C++側は既存コードなのでC#側で対応したいです。値を変換するためだけのDLLをC++/CLIで作るとよいのでしょうか?
C++のコード
typedef struct {
bool isBar;
int val;
WCHAR name[100];
} Bar;
typedef struct {
int val;
TCHAR name[100];
Bar bar[1];
} Foo;
void StartDrag(Foo foo) {
STGMEDIUM data;
data.tymed = TYMED_HGLOBAL;
data.hGlobal = (HGLOBAL)foo;
data.pUnkForRelease = NULL;
CLIPFORMAT f;
f = RegisterClipboardFormat(TEXT("FOO"));
COleDataSource *DataSource = new COleDataSource();
DataSource->CacheData(f, &data);
DataSource->DoDragDrop(DROPEFFECT_COPY|DROPEFFECT_MOVE);
}
C#のコード
[StructLayout(LayoutKind.Sequential)]
public struct Bar
{
[MarshalAs(UnmanagedType.Bool)]
public bool IsText;
public int value;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
public string name;
}
[StructLayout(LayoutKind.Sequential)]
public struct Foo
{
public int value;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
public string name;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)]
public Bar[] bar;
}
void OnDrop(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent("FOO"))
{
var fooStream = e.Data.GetData("FOO");
// fooStreamはMemoryStream、BinaryReaderで見ると
// C++側で設定した値が入っているのが見える
var foo = e.Data.GetData(typeof(Foo)); // fooはnull
}
}