Я не могу скомпилировать приведенный ниже код 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. Ничего не изменилось.
Впереди долгий путь, если вы хотите использовать GCC/MinGW для компиляции под Windows. Если вы хотите серьезно программировать для Windows и воспользоваться готовыми заголовками Windows SDK, вам следует использовать MSVC.
Вы пропустите важный #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
Я добавил в код #define INITGUID. Теперь он работает отлично. Вы сэкономили мое время.
IID_IShellFolder
определен в файле shell32.lib, который должен быть связан с вашим приложением. Я не уверен, сможет ли GCC связать библиотеку, возможно, для связи ему потребуется другая библиотека.