Здравствуйте, S_V_B, Вы писали:
S_V>Здравствуйте, Jolly Roger, Вы писали:
JR>>Здравствуйте, S_V_B, Вы писали:
S_V>>>S_V>>> [DllImport("shell32")]
S_V>>> internal static extern uint DragQueryFile(uint hDrop,uint iFile, StringBuilder buffer, int cch);
S_V>>>
JR>>Попробуйте тип hDrop поменять на IntPtr.
S_V>Попробовал, к сожалению, не помогло.
S_V>На x86 продолжает работать, а на x64 — нет :(
На х64 в DragQueryFile может передаваться пустой hDrop. Причина в том, что hDrop неправильно получается. А получается он неправльно из-за неверно определённых структур для x64. В System.Runtime.InteropServices.ComTypes есть нужные структуры для получения hDrop.
int IShellExtInit.Initialize (IntPtr pidlFolder, IntPtr lpdobj, uint hKeyProgID)
{
try
{
m_dataObject = null;
if (lpdobj != (IntPtr)0)
{
m_dataObject = (System.Runtime.InteropServices.ComTypes.IDataObject)Marshal.GetObjectForIUnknown(lpdobj);
System.Runtime.InteropServices.ComTypes.FORMATETC format = new System.Runtime.InteropServices.ComTypes.FORMATETC();
format.tymed = System.Runtime.InteropServices.ComTypes.TYMED.TYMED_HGLOBAL;
format.lindex = -1;
format.ptd = (IntPtr)0;
format.dwAspect = System.Runtime.InteropServices.ComTypes.DVASPECT.DVASPECT_CONTENT;
format.cfFormat = 15;
System.Runtime.InteropServices.ComTypes.STGMEDIUM med = new System.Runtime.InteropServices.ComTypes.STGMEDIUM();
m_dataObject.GetData(ref format, out med);
m_hDrop = (uint)med.unionmember;
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
return 0;
}