Я не могу скомпилировать приведенный ниже код 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. Ничего не изменилось.
Я использовал оба.
Выберите только один языковой тег. Ответ на такой вопрос зависит от языка программирования, который вы здесь используете.
@3CxEZiVlQ Я выбрал C.
Спасибо. Ответ на вопрос C уже дан и является правильным.
COM удобнее всего использовать с C++. COM-совместимый компилятор C++ преобразует поиск lpVtbl
в более естественные функции-члены класса. Заголовки SDK оптимизированы для этого варианта использования.
Чтобы использовать COM-интерфейсы из C, вам необходимо сделать видимыми условно исключенные объявления C. Они охраняются директивой препроцессора #ifdef COBJMACROS
.
С использованием
#define COBJMACROS
перед включением каких-либо заголовочных файлов определения интерфейса позволит вам использовать интерфейсы C из C.
Я добавил #define COBJMACROS, но, к сожалению, получил тот же результат.
@Niteya Это должно сработать, если вы компилируете свой код как C. Если вы компилируете свой код как C++, вы можете попробовать добавить #define CINTERFACE
в дополнение к COBJMACROS
.
Первая проблема была решена, но на этот раз я получил следующую ошибку при компиляции кода как C: неопределенная ссылка на `IID_IShellFolder'
Это ошибка компоновщика. Кажется, вы не связываете приложение с shell32.lib.
@3CxEZiVlQ Я добавил проект - Параметры сборки - Настройки компоновщика - Другие параметры компоновщика как -lshell32, но получил ту же ошибку.
Вы получаете еще одну ошибку. На исходный вопрос дан ответ. Примите ответ и задайте новый вопрос с минимально воспроизводимым примером и дословным сообщением об ошибке.
вы компилируете это как C или как C++? Пожалуйста, отметьте правильный язык и удалите другой