使用 HWND 获取 IDropTarget 抛出 0xC0000005 访问冲突
Get IDropTarget with HWND throw 0xC0000005 access violation
我正在尝试通过具有 IDropTarget 接口的 C++ 代码(或 .NET)模拟拖放以将文件拖放到另一个应用程序中。
我已经阅读并测试了不同的解决方案。我有一些代码可以删除一个与鼠标一起工作的文件。
但是这段代码应该可以抛出访问冲突异常。
你有解释吗?谢谢。
W7 64 位、VC6、VS2013 C++ 有同样的问题。
stdafx.h
#include <stdio.h>
#include <tchar.h>
#include <oleidl.h>
#include <Atlbase.h>
TestDragDrop.cpp
#include "stdafx.h"
IDropTarget* GetRegisteredDropTargetFromWnd(HWND hWnd)
{
IUnknown *pBuffer = (IUnknown *)GetProp(hWnd, TEXT("OleDropTargetInterface"));
if (pBuffer != NULL) // pBuffer = address can see on properties tab with WinSpy++
{
IDropTarget *pRetVal = NULL;
// throw exception 0xC0000005 acess violation
if (SUCCEEDED(pBuffer->QueryInterface(IID_IDropTarget, (void **)&pRetVal)))
return pRetVal;
}
return NULL;
}
int main(int argc, char* argv[])
{
CoInitialize(NULL);
HWND hWnd = (HWND)0x00181E04; // get with WinSpy++
IDropTarget* pDT = GetRegisteredDropTargetFromWnd(hWnd);
CoUninitialize();
return 0;
}
非常感谢 Hans Passant。我尝试另一种方法,在主窗体中添加控件并编写此代码
DataObject daobj = new DataObject();
StringCollection strcol = new StringCollection();
strcol.Add("F:\test.jpg");
daobj.SetFileDropList(strcol);
IDropTarget dt = (IDropTarget)ctrl;
dt.OnDragDrop(new DragEventArgs(daobj, 0, 0, 0, DragDropEffects.Copy, DragDropEffects.Copy));
我正在尝试通过具有 IDropTarget 接口的 C++ 代码(或 .NET)模拟拖放以将文件拖放到另一个应用程序中。
我已经阅读并测试了不同的解决方案。我有一些代码可以删除一个与鼠标一起工作的文件。
但是这段代码应该可以抛出访问冲突异常。
你有解释吗?谢谢。
W7 64 位、VC6、VS2013 C++ 有同样的问题。
stdafx.h
#include <stdio.h>
#include <tchar.h>
#include <oleidl.h>
#include <Atlbase.h>
TestDragDrop.cpp
#include "stdafx.h"
IDropTarget* GetRegisteredDropTargetFromWnd(HWND hWnd)
{
IUnknown *pBuffer = (IUnknown *)GetProp(hWnd, TEXT("OleDropTargetInterface"));
if (pBuffer != NULL) // pBuffer = address can see on properties tab with WinSpy++
{
IDropTarget *pRetVal = NULL;
// throw exception 0xC0000005 acess violation
if (SUCCEEDED(pBuffer->QueryInterface(IID_IDropTarget, (void **)&pRetVal)))
return pRetVal;
}
return NULL;
}
int main(int argc, char* argv[])
{
CoInitialize(NULL);
HWND hWnd = (HWND)0x00181E04; // get with WinSpy++
IDropTarget* pDT = GetRegisteredDropTargetFromWnd(hWnd);
CoUninitialize();
return 0;
}
非常感谢 Hans Passant。我尝试另一种方法,在主窗体中添加控件并编写此代码
DataObject daobj = new DataObject();
StringCollection strcol = new StringCollection();
strcol.Add("F:\test.jpg");
daobj.SetFileDropList(strcol);
IDropTarget dt = (IDropTarget)ctrl;
dt.OnDragDrop(new DragEventArgs(daobj, 0, 0, 0, DragDropEffects.Copy, DragDropEffects.Copy));