2015-01-14 1 views
0


IDropTarget 인터페이스를 사용하여 C++ 코드 (또는 .NET)로 다른 응용 프로그램에서 파일을 끌어 놓기 위해 시뮬레이션하려고합니다.
다른 솔루션을 읽고 테스트했습니다. 마우스로 작업하는 파일을 삭제하는 약간의 코드가 있습니다.
그러나이 코드는 작동해야 액세스 위반 예외가 throw됩니다.
설명이 있으십니까? 고맙습니다.

W7 64Bits, VC6, VS2013 C++에 동일한 문제가 있습니다.
IDropTarget HWND throw 0xC0000005 액세스 위반

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; 
} 
+0

내 크리스탈 볼이 창을 다른 프로세스가 소유하고 있다고이 코드를 기본 폼에 컨트롤을 추가하여 다른 방법을 시도하고 쓰기 해요. 따라서 IUnknown * 포인터는 쓸모가 없으며 다른 프로세스에서만 작동 할 수 있습니다. –

+0

크리스탈 볼이 잘 작동합니다. 이것이 문제의 원인입니다. IDropTarget을 다른 프로세스로 가져 오는 방법을 알고 있습니까? – ludo

답변

0

정당한 이유 때문에 한스 패스 원에게 감사드립니다. 나는

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)); 
관련 문제