小编v77*_*v77的帖子

从32位拖放到64位

我正在编写一个接受文件拖放的C程序.当它以32位编译时,无论如何都适用.但是当它以64位编译时,它仅适用于从64位应用程序拖动的文件:

  • 32位 - > 32位:成功
  • 64位 - > 64位:成功
  • 64位 - > 32位:成功
  • 32位 - > 64位:失败

我仍然得到WM_DROPFILES消息,但DragQueryFile没有返回任何内容(文件数为0).

这似乎是许多应用程序的问题,但我想知道是否有解决方法.

编辑:

  • 如果我将文件从64位可执行文件拖放到我的64位应用程序,wParam有一个值,如0x000000F211C000B8(表明没有强制转换问题).
  • 接下来,在不关闭我的应用程序的情况下,如果我从32位可执行文件中拖动文件,wParam将具有类似0x0000000011C000B8或0xFFFFFFFF11C000B8的内容,这意味着高位32位无效.
  • 如果我用前一条消息中的有效高位替换无效高位(在本例中,这将是0x000000F2),那么DragQueryFile可以工作!

所以数据在这里,某处,我只是不知道如何检索它们(至少没有丑陋的黑客).

编辑2:

我将不提供任何代码,因为我认为那些回答的人知道这个影响大量软件的问题.

------编辑----------

重现它的最小代码

LRESULT WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    WCHAR sz[32];
    switch (uMsg)
    {
    case WM_DROPFILES:
        swprintf(sz, L"%p", wParam);// look for wParam
        MessageBox(0,0,sz,0);
        break;
    case WM_NCCREATE:
        DragAcceptFiles(hwnd, TRUE);
        break;
    case WM_NCDESTROY:
        PostQuitMessage(0);
        break;
    }

    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

void minimal()
{
    static WNDCLASS wndcls = { 0, WindowProc, 0, …
Run Code Online (Sandbox Code Playgroud)

c winapi drag-and-drop

6
推荐指数
1
解决办法
1241
查看次数

标签 统计

c ×1

drag-and-drop ×1

winapi ×1