Code::Blocks 20.03 — 64-битная ошибка компилятора с кодом C: неопределенная ссылка на `IID_IShellFolder'

Я не могу скомпилировать приведенный ниже код winapi с помощью компилятора Code::Blocks 20.03 - 64 бит и получаю следующие сообщения об ошибках:

#include <tchar.h>
#include <windows.h>
#include <commctrl.h>
#include <shlobj.h>
#include <shlwapi.h>
#include <objidl.h>

LPSHELLFOLDER lpsf;

if (SUCCEEDED(SHGetDesktopFolder(&lpsf))) {
   LPITEMIDLIST lpidl = (LPITEMIDLIST) item.lParam;
   char m1[MAX_PATH];

   if (SHGetPathFromIDList(lpidl, m1)) {
      if (lpidl->mkid.cb) {
         LPSHELLFOLDER lpsfSub;
         if (SUCCEEDED(lpsf->lpVtbl->BindToObject(lpsf, lpidl, NULL, &IID_IShellFolder,(void **)&lpsfSub))) {
            FillTreeEx(lpsfSub, lpidl, item.hItem);
            lpsfSub->lpVtbl->Release(lpsfSub);
         }
      }
   }
   lpsf->lpVtbl->Release(lpsf);
}

Ошибка: неопределенная ссылка на IID_IShellFolder.

Есть предложения?

Я попробовал компилятор GNU GCC по умолчанию и компилятор msys64 mingw. Ничего не изменилось.

🤔 А знаете ли вы, что...
C обеспечивает высокую производительность и эффективность программ, что делает его выбором для встраиваемых систем и микроконтроллеров.


51
1

Ответ:

Решено

Вы пропустите важный #define перед первым #include файлом Windows Kit.

#define INITGUID

Если макрос не определен, то IID_IShellFolder берется из shell32.lib, но GCC/MinGW не может связать библиотеки Windows Kit, он использует свои собственные библиотеки времени выполнения Win32: msys2-w32api-runtime. Вам следует настроить свой проект для связи с /usr/lib/w32api/libshell32.a: это -lshell32.

Если не помогает, то /usr/lib/w32api/libshell32.a не определяет IID_IShellFolder и вам придется определить его в своем коде:

const IID IID_IShellFolder = {0x000214E6, 0x0, 0x0, {0xC0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,0x46}};

Смотри C:\Program Files (x86)\Windows Kits\10\Include\<Kit-Version>\um\ShlGuid.h