extern "C" {} - это соглашение C ++, объявляющее, что вложенные функции являются функциями C, а не функциями C ++. C ++ имеет немного другое соглашение об именах, которое конфликтует с C. Если у вас есть библиотека, написанная на C, и вы хотите использовать ее в программе на C ++, вы должны использовать extern "C" {}, чтобы компилятор знал, что это функции C. Если библиотека была написана на C ++, я полагаю, что extern "C" {} вызовет ошибку.
Обратите внимание, что extern имеет несколько значений - этот конкретный случай является соглашением C ++ и не связан с различным использованием extern. Например,
extern int count;
имеет совершенно другое значение, чем extern "C" {}.
typedef отделен от внешней проблемы "C" {}. typedefs позволяют создавать псевдонимы для распространенных типов, которые имеют больше смысла. Например, объявление структур часто является многословным процессом. Я могу использовать typedef, чтобы сократить его:
struct mystruct {int a; int b};
typedef struct mystruct returncode;
// I can now declare a variable as type 'returncode'
returncode a;
Таким образом, в вашем примере HRESULT на самом деле является псевдонимом для (* CREATEDEVICE) (), хотя я считаю, что вы должны поставить его перед функцией (а не после).