1

我正在尝试将System::Windows::Forms::IDataObject转换为 ObjIdl.h 中定义的本机IDataObject 。不幸的是,以下源代码不返回本机 IDataObject。

IntPtr pData = System::Runtime::InteropServices::Marshal::GetIUnknownForObject(e->Data);
::IDataObject* data = (::IDataObject*) pData.ToPointer();

如何在拖放期间在 Windows 窗体应用程序中获取本机 IDataObject?

4

1 回答 1

2

使用 C 样式强制转换来强制转换 COM 接口指针是不合法的。您必须使用 QueryInterface() 方法很好地询问。像这样:

 System::Windows::Forms::IDataObject^ obj = Clipboard::GetDataObject();
 ::IUnknown* punk = (::IUnknown*)System::Runtime::InteropServices::Marshal::GetIUnknownForObject(obj).ToPointer();
 ::IDataObject* pdata = nullptr;
 HRESULT hr = punk->QueryInterface(__uuidof(::IDataObject), (void**)&pdata);
 if (SUCCEEDED(hr)) {
     // etc..
 }
于 2012-11-01T15:58:55.153 回答