Code::Blocks 20.03 64位编译器编译WinAPI代码报错求助
解决Code::Blocks中WinAPI COM代码编译错误的方法
错误原因
你遇到的lpVtbl成员不存在的错误,核心是COM接口调用方式与编译器编译语言不匹配:
- C语言环境下,COM接口通过包含
lpVtbl指针的结构体实现,必须显式通过lpVtbl调用方法; - C++环境下,COM接口被处理为虚函数类,直接调用成员函数即可,无需
lpVtbl。
你的代码用了C风格的COM调用,但编译器可能以C++模式编译,或者头文件未正确导出C风格接口定义。
解决方法
方法1:改用C++风格的COM调用(推荐)
去掉代码中的lpVtbl,并调整参数(C++会自动传递this指针,无需显式传入接口指针作为第一个参数):
修改后的代码片段:
#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; // 移除lpVtbl,且不再传入第一个lpsf参数 if(SUCCEEDED(lpsf->BindToObject(lpidl, NULL, IID_IShellFolder,(void **)&lpsfSub))) { FillTreeEx(lpsfSub, lpidl, item.hItem); lpsfSub->Release(); // 简化调用 } } } lpsf->Release(); // 简化调用 }
配套设置:
- 将代码文件后缀改为
.cpp,或在Code::Blocks项目设置中,把该文件的编译模式设为C++; - 链接器选项添加依赖库:
-lshlwapi -lshell32(路径:项目 -> 构建选项 -> 链接器 -> 其他链接器选项)。
方法2:坚持用C语言编译
若要保持C语言模式,需做以下调整:
- 将代码文件后缀改为
.c; - 在所有头文件包含前添加宏定义,确保Windows头文件导出C风格COM接口:
#define _WIN32_WINNT 0x0600 // 指定最低支持Windows Vista #define STRICT #include <tchar.h> #include <windows.h> // 其他头文件...
- 同样在链接器选项中添加
-lshlwapi -lshell32。
内容的提问来源于stack exchange,提问作者Niteya
相关产品推荐
相关产品推荐

