我正在尝试转换 System::Windows::Forms::IDataObject进入原生IDataObject在 ObjIdl.h 中定义。不幸的是,以下源代码不返回 native IDataObject。
IntPtr pData = System::Runtime::InteropServices::Marshal::GetIUnknownForObject(e->Data);
::IDataObject* data = (::IDataObject*) pData.ToPointer();
如何在拖放过程中获取 Windows 窗体应用程序中的 native IDataObject?
最佳答案
使用 C 风格的转换来转换 COM 接口(interface)指针是不合法的。您必须使用 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..
}
关于c++ - 如何访问 native IDataObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13178517/