代码::块 20.03 - 64 位编译器错误

问题描述 投票:0回答:1

我无法使用 Code::Blocks 20.03 - 64 位编译器编译下面的 winapi 代码并收到以下错误消息:

#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++ c winapi codeblocks
1个回答
0
投票

COM 与 C++ 一起使用最为方便。 COM 兼容的 C++ 编译器会将

lpVtbl
查找转换为更自然的类成员函数。 SDK 标头针对此用例进行了优化。

要使用 C 中的 COM 接口,您必须使有条件排除的 C 声明可见。它们由

#ifdef COBJMACROS
预处理器指令保护。

使用

#define COBJMACROS

在包含任何接口定义头文件之前,您将能够从 C 使用 C 接口。

© www.soinside.com 2019 - 2024. All rights reserved.