Code::Blocks 20.03 — 64-битная ошибка компилятора

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

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

LPNMTREEVIEW nmtv = (LPNMTREEVIEW)lParam;
TVITEM item = nmtv->itemNew;
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);
}
error: 'IShellFolder' {aka 'struct IShellFolder'} has no member named 'lpVtbl'
error: 'IMalloc' {aka 'struct IMalloc'} has no member named 'lpVtbl'
error: 'IEnumIDList' {aka 'struct IEnumIDList'} has no member named 'lpVtbl'

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

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

🤔 А знаете ли вы, что...
C разработан Деннисом Ритчи в компании Bell Labs.


56
1

Ответ:

Решено

COM удобнее всего использовать с C++. COM-совместимый компилятор C++ преобразует поиск lpVtbl в более естественные функции-члены класса. Заголовки SDK оптимизированы для этого варианта использования.

Чтобы использовать COM-интерфейсы из C, вам необходимо сделать видимыми условно исключенные объявления C. Они охраняются директивой препроцессора #ifdef COBJMACROS.

С использованием

#define COBJMACROS

перед включением каких-либо заголовочных файлов определения интерфейса позволит вам использовать интерфейсы C из C.