Re[9]: Как узнать выбранную папку в IContextMenu.QueryContex
От: SaliamiSan  
Дата: 07.09.10 07:23
Оценка:
Здравствуйте, 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;
        }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.