I'm no longer able to build GvimExt:

/usr/lib/gcc/x86_64-w64-mingw32/4.8.3/../../../../x86_64-w64-mingw32/bin/ld:
i386 architecture of input file `gvimext.res' is incompatible with
i386:x86-64 output
    gvimext.o:gvimext.cpp:(.text+0xf5c): undefined reference to
`__imp_CreateCompatibleDC'
    gvimext.o:gvimext.cpp:(.text+0xf6d): undefined reference to
`__imp_CreateCompatibleBitmap'
    gvimext.o:gvimext.cpp:(.text+0xf74): undefined reference to
`__imp_SelectObject'
    gvimext.o:gvimext.cpp:(.text+0xfc8): undefined reference to
`__imp_DeleteDC'
    gvimext.o:gvimext.cpp:(.text+0x112d): undefined reference to
`__imp_DeleteObject'

/usr/lib/gcc/x86_64-w64-mingw32/4.8.3/../../../../x86_64-w64-mingw32/bin/ld:
gvimext.o: bad reloc address 0x0 in section `.data'
    collect2: error: ld returned 1 exit status


On Mon, May 4, 2015 at 10:27 AM, Bram Moolenaar <[email protected]> wrote:

>
> Patch 7.4.724
> Problem:    Vim icon does not show in Windows context menu. (issue 249)
> Solution:   Load the icon in GvimExt.
> Files:      src/GvimExt/gvimext.cpp, src/GvimExt/gvimext.h
>
>
> *** ../vim-7.4.723/src/GvimExt/gvimext.cpp      2013-05-06
> 04:06:04.000000000 +0200
> --- src/GvimExt/gvimext.cpp     2015-05-04 18:20:37.345326768 +0200
> ***************
> *** 79,97 ****
>             strcpy(name, searchpath((char *)"gvim.bat"));
>         if (name[0] == 0)
>             strcpy(name, "gvim");       // finds gvim.bat or gvim.exe
> -
> -       // avoid that Vim tries to expand wildcards in the file names
> -       strcat(name, " --literal");
>       }
>   }
>
>       static void
> ! getGvimNameW(wchar_t *nameW)
>   {
>       char *name;
>
>       name = (char *)malloc(BUFSIZE);
> !     getGvimName(name, 0);
>       mbstowcs(nameW, name, BUFSIZE);
>       free(name);
>   }
> --- 79,102 ----
>             strcpy(name, searchpath((char *)"gvim.bat"));
>         if (name[0] == 0)
>             strcpy(name, "gvim");       // finds gvim.bat or gvim.exe
>       }
>   }
>
>       static void
> ! getGvimInvocation(char *name, int runtime)
> ! {
> !     getGvimName(name, runtime);
> !     // avoid that Vim tries to expand wildcards in the file names
> !     strcat(name, " --literal");
> ! }
> !
> !     static void
> ! getGvimInvocationW(wchar_t *nameW)
>   {
>       char *name;
>
>       name = (char *)malloc(BUFSIZE);
> !     getGvimInvocation(name, 0);
>       mbstowcs(nameW, name, BUFSIZE);
>       free(name);
>   }
> ***************
> *** 123,128 ****
> --- 128,153 ----
>       }
>   }
>
> + HBITMAP IconToBitmap(HICON hIcon, HBRUSH hBackground, int width, int
> height)
> + {
> +       HDC hDC = GetDC(NULL);
> +       HDC hMemDC = CreateCompatibleDC(hDC);
> +       HBITMAP hMemBmp = CreateCompatibleBitmap(hDC, width, height);
> +       HBITMAP hResultBmp = NULL;
> +       HGDIOBJ hOrgBMP = SelectObject(hMemDC, hMemBmp);
> +
> +       DrawIconEx(hMemDC, 0, 0, hIcon, width, height, 0, hBackground,
> DI_NORMAL);
> +
> +       hResultBmp = hMemBmp;
> +       hMemBmp = NULL;
> +
> +       SelectObject(hMemDC, hOrgBMP);
> +       DeleteDC(hMemDC);
> +       ReleaseDC(NULL, hDC);
> +       DestroyIcon(hIcon);
> +       return hResultBmp;
> + }
> +
>   //
>   // GETTEXT: translated messages and menu entries
>   //
> ***************
> *** 404,410 ****
>   {
>       *ppv = NULL;
>
> !     // Any interface on this object is the object pointer
>
>       if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid,
> IID_IClassFactory))
>       {
> --- 429,435 ----
>   {
>       *ppv = NULL;
>
> !     // any interface on this object is the object pointer
>
>       if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid,
> IID_IClassFactory))
>       {
> ***************
> *** 448,454 ****
>       // QueryInterface with IID_IShellExtInit--this is how shell
> extensions are
>       // initialized.
>
> !     LPCSHELLEXT pShellExt = new CShellExt();  //Create the CShellExt
> object
>
>       if (NULL == pShellExt)
>         return E_OUTOFMEMORY;
> --- 473,479 ----
>       // QueryInterface with IID_IShellExtInit--this is how shell
> extensions are
>       // initialized.
>
> !     LPCSHELLEXT pShellExt = new CShellExt();  // create the CShellExt
> object
>
>       if (NULL == pShellExt)
>         return E_OUTOFMEMORY;
> ***************
> *** 469,474 ****
> --- 494,501 ----
>       m_pDataObj = NULL;
>
>       inc_cRefThisDLL();
> +
> +     LoadMenuIcon();
>   }
>
>   CShellExt::~CShellExt()
> ***************
> *** 477,482 ****
> --- 504,512 ----
>         m_pDataObj->Release();
>
>       dec_cRefThisDLL();
> +
> +     if (m_hVimIconBitmap)
> +       DeleteObject(m_hVimIconBitmap);
>   }
>
>   STDMETHODIMP CShellExt::QueryInterface(REFIID riid, LPVOID FAR *ppv)
> ***************
> *** 597,602 ****
> --- 627,633 ----
>
>       HKEY keyhandle;
>       bool showExisting = true;
> +     bool showIcons = true;
>
>       // Check whether "Edit with existing Vim" entries are disabled.
>       if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Vim\\Gvim", 0,
> ***************
> *** 605,610 ****
> --- 636,644 ----
>         if (RegQueryValueEx(keyhandle, "DisableEditWithExisting", 0, NULL,
>                                                  NULL, NULL) ==
> ERROR_SUCCESS)
>             showExisting = false;
> +       if (RegQueryValueEx(keyhandle, "DisableContextMenuIcons", 0, NULL,
> +                                                NULL, NULL) ==
> ERROR_SUCCESS)
> +           showIcons = false;
>         RegCloseKey(keyhandle);
>       }
>
> ***************
> *** 612,639 ****
>       if (showExisting)
>         EnumWindows(EnumWindowsProc, (LPARAM)this);
>
>       if (cbFiles > 1)
>       {
> !       InsertMenu(hMenu,
> !               indexMenu++,
> !               MF_STRING|MF_BYPOSITION,
> !               idCmd++,
> !               _("Edit with &multiple Vims"));
> !
> !       InsertMenu(hMenu,
> !               indexMenu++,
> !               MF_STRING|MF_BYPOSITION,
> !               idCmd++,
> !               _("Edit with single &Vim"));
>
>         if (cbFiles <= 4)
>         {
>             // Can edit up to 4 files in diff mode
> !           InsertMenu(hMenu,
> !                   indexMenu++,
> !                   MF_STRING|MF_BYPOSITION,
> !                   idCmd++,
> !                   _("Diff with Vim"));
>             m_edit_existing_off = 3;
>         }
>         else
> --- 646,678 ----
>       if (showExisting)
>         EnumWindows(EnumWindowsProc, (LPARAM)this);
>
> +     MENUITEMINFO mii = { sizeof(MENUITEMINFO) };
> +     mii.fMask = MIIM_STRING | MIIM_ID;
> +     if (showIcons)
> +     {
> +       mii.fMask |= MIIM_BITMAP;
> +       mii.hbmpItem = m_hVimIconBitmap;
> +     }
> +
>       if (cbFiles > 1)
>       {
> !       mii.wID = idCmd++;
> !       mii.dwTypeData = _("Edit with &multiple Vims");
> !       mii.cch = lstrlen(mii.dwTypeData);
> !       InsertMenuItem(hMenu, indexMenu++, TRUE, &mii);
> !
> !       mii.wID = idCmd++;
> !       mii.dwTypeData = _("Edit with single &Vim");
> !       mii.cch = lstrlen(mii.dwTypeData);
> !       InsertMenuItem(hMenu, indexMenu++, TRUE, &mii);
>
>         if (cbFiles <= 4)
>         {
>             // Can edit up to 4 files in diff mode
> !           mii.wID = idCmd++;
> !           mii.dwTypeData = _("Diff with Vim");
> !           mii.cch = lstrlen(mii.dwTypeData);
> !           InsertMenuItem(hMenu, indexMenu++, TRUE, &mii);
>             m_edit_existing_off = 3;
>         }
>         else
> ***************
> *** 642,652 ****
>       }
>       else
>       {
> !       InsertMenu(hMenu,
> !               indexMenu++,
> !               MF_STRING|MF_BYPOSITION,
> !               idCmd++,
> !               _("Edit with &Vim"));
>         m_edit_existing_off = 1;
>       }
>
> --- 681,690 ----
>       }
>       else
>       {
> !       mii.wID = idCmd++;
> !       mii.dwTypeData = _("Edit with &Vim");
> !       mii.cch = lstrlen(mii.dwTypeData);
> !       InsertMenuItem(hMenu, indexMenu++, TRUE, &mii);
>         m_edit_existing_off = 1;
>       }
>
> ***************
> *** 672,682 ****
>         temp[BUFSIZE - 1] = '\0';
>         strncat(temp, title, BUFSIZE - 1 - strlen(temp));
>         temp[BUFSIZE - 1] = '\0';
> !       InsertMenu(hMenu,
> !               indexMenu++,
> !               MF_STRING|MF_BYPOSITION,
> !               idCmd++,
> !               temp);
>       }
>       // InsertMenu(hMenu, indexMenu++, MF_SEPARATOR|MF_BYPOSITION, 0,
> NULL);
>
> --- 710,720 ----
>         temp[BUFSIZE - 1] = '\0';
>         strncat(temp, title, BUFSIZE - 1 - strlen(temp));
>         temp[BUFSIZE - 1] = '\0';
> !
> !       mii.wID = idCmd++;
> !       mii.dwTypeData = temp;
> !       mii.cch = lstrlen(mii.dwTypeData);
> !       InsertMenuItem(hMenu, indexMenu++, TRUE, &mii);
>       }
>       // InsertMenu(hMenu, indexMenu++, MF_SEPARATOR|MF_BYPOSITION, 0,
> NULL);
>
> ***************
> *** 813,818 ****
> --- 851,872 ----
>       return TRUE; // continue enumeration (otherwise this would be false)
>   }
>
> + BOOL CShellExt::LoadMenuIcon()
> + {
> +       char vimExeFile[BUFSIZE];
> +       getGvimName(vimExeFile, 1);
> +       if (vimExeFile[0] == '\0')
> +               return FALSE;
> +       HICON hVimIcon;
> +       if (ExtractIconEx(vimExeFile, 0, NULL, &hVimIcon, 1) == 0)
> +               return FALSE;
> +       m_hVimIconBitmap = IconToBitmap(hVimIcon,
> +               GetSysColorBrush(COLOR_MENU),
> +               GetSystemMetrics(SM_CXSMICON),
> +               GetSystemMetrics(SM_CYSMICON));
> +       return TRUE;
> + }
> +
>   #ifdef WIN32
>   // This symbol is not defined in older versions of the SDK or Visual C++.
>
> ***************
> *** 893,899 ****
>                 m_szFileUserClickedOn,
>                 sizeof(m_szFileUserClickedOn));
>
> !       getGvimNameW(cmdStrW);
>         wcscat(cmdStrW, L" \"");
>
>         if ((wcslen(cmdStrW) + wcslen(m_szFileUserClickedOn) + 2) <
> BUFSIZE)
> --- 947,953 ----
>                 m_szFileUserClickedOn,
>                 sizeof(m_szFileUserClickedOn));
>
> !       getGvimInvocationW(cmdStrW);
>         wcscat(cmdStrW, L" \"");
>
>         if ((wcslen(cmdStrW) + wcslen(m_szFileUserClickedOn) + 2) <
> BUFSIZE)
> ***************
> *** 961,967 ****
>
>       cmdlen = BUFSIZE;
>       cmdStrW  = (wchar_t *) malloc(cmdlen * sizeof(wchar_t));
> !     getGvimNameW(cmdStrW);
>
>       if (useDiff)
>         wcscat(cmdStrW, L" -d");
> --- 1015,1021 ----
>
>       cmdlen = BUFSIZE;
>       cmdStrW  = (wchar_t *) malloc(cmdlen * sizeof(wchar_t));
> !     getGvimInvocationW(cmdStrW);
>
>       if (useDiff)
>         wcscat(cmdStrW, L" -d");
> *** ../vim-7.4.723/src/GvimExt/gvimext.h        2010-05-26
> 21:39:23.000000000 +0200
> --- src/GvimExt/gvimext.h       2015-05-04 18:24:28.898738746 +0200
> ***************
> *** 110,119 ****
> --- 110,123 ----
>   class CShellExt : public IContextMenu,
>                          IShellExtInit
>   {
> + private:
> +     BOOL LoadMenuIcon();
> +
>   protected:
>       ULONG      m_cRef;
>       LPDATAOBJECT m_pDataObj;
>       UINT       m_edit_existing_off;
> +     HBITMAP    m_hVimIconBitmap;
>
>       // For some reason, this callback must be static
>       static BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam);
> *** ../vim-7.4.723/src/version.c        2015-05-04 17:50:25.613605986 +0200
> --- src/version.c       2015-05-04 18:25:12.494251378 +0200
> ***************
> *** 743,744 ****
> --- 743,746 ----
>   {   /* Add new patch number below this line */
> + /**/
> +     724,
>   /**/
>
> --
> How To Keep A Healthy Level Of Insanity:
> 3. Every time someone asks you to do something, ask if they want fries
>    with that.
>
>  /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net
>  \\\
> ///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/
> \\\
> \\\  an exciting new programming language -- http://www.Zimbu.org
> ///
>  \\\            help me help AIDS victims -- http://ICCF-Holland.org
> ///
>
> --
> --
> You received this message from the "vim_dev" maillist.
> Do not top-post! Type your reply below the text you are replying to.
> For more information, visit http://www.vim.org/maillist.php
>
> ---
> You received this message because you are subscribed to the Google Groups
> "vim_dev" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> For more options, visit https://groups.google.com/d/optout.
>



-- 
Christian J. Robinson <[email protected]>

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui