I’ve spent a while adding new features to my FTP client, and you’ll get to see some of that in a month or two, when it all comes together as a release.
One of the latest is “drag and drop” – and I went searching for advice on how to do the drag and drop from “virtual folders” – i.e. when the files don’t exist locally until you actually do the drop. So you can’t do the easy method of passing a file location to the drop target. I found a great document that perfectly describes what I need to do:
Great, clear, simple advice (simple, if you’re a developer) on how to do drag and drop – and it serves a second purpose, that of cut/copy and paste.
So, I get the drag and drop working, and then I go to look at the cut/copy and paste, and add the few lines of extra code needed.
It doesn’t work.
I realise quickly that the following lines are the problem:
7. When the paste is complete, the target calls the IDataObject::SetData method with the CFSTR_PASTESUCCEEDED format set to DROPEFFECT_MOVE.
8. When the source’s IDataObject::SetData method is called with the CFSTR_PASTESUCCEEDED format set to DROPEFFECT_MOVE, it must check to see if it also received the CFSTR_PERFORMEDDROPEFFECT format set to DROPEFFECT_MOVE. If both formats are sent by the target, the source will have to delete the data. If only the CFSTR_PASTESUCCEEDED format is received, the source can simply remove the data from its display. If the transfer fails, the source updates the display to its original appearance.
No matter how much I try, I can’t get CFSTR_PASTESUCCEEDED into my SetData method. I get the CFSTR_PERFORMEDDROPEFFECT format, so I know I’m setting it up correctly, but I get no CFSTR_PASTESUCCEEDED.
Days of trying different code, different ways of triggering the paste, go by, and I finally realise that there is no CFSTR_PASTESUCCEEDED coming from Windows Explorer – and since this is the de-facto drop target, that’s exactly the model that is going to be followed by every other drop target I’m going to meet.
I’d really love to tell Microsoft about this, and get the documentation fixed. This used to be dead easy – I’d click on the “SDK Feedback” button, and send an email.
No “SDK Feedback” button any more.
Why not? Where did it go?
What’s in its place? Nothing terribly useful – a link to a web page that I can fill in.
Can I attach a file of source code to demonstrate this?
Can I italicise words that are important?
Does the web page offer any extra capabilities that can’t be done in an email?
So, why did this happen? Beats me.
I finally decided to give up and ignore CFSTR_PASTESUCCEEDED entirely. It seems superfluous. I do find it thoroughly irritating that my time is wasted once again, because I tried to follow specific documentation that turned out not just to be wrong, but to have unnecessary, and incorrect, extra detail. This isn’t the first time (the last time was when I was following documentation on how to close SSL connections), and I doubt that it will be the last.