У меня нет ответа для вас, но у меня был этот опыт несколько раз, и я хотел бы поделиться тем, что я сделал.
В нескольких не связанных проектах у меня был один и тот же сценарий. Я пытался разрешить зависимости почти неделю, но в итоге мне пришлось сократить свои потери, чтобы не отставать от графика. В итоге я использовал #include для файла .tlh (при их выполнении будет произведен импорт в DLL), а затем с помощью API-вызовов «classic com» для получения указателей на структуры внутри файлов .tlh. Код не так чист для работы, как если бы вы могли использовать файлы-оболочки, но он работает.
IUnknown *lpUnk;
hr = CoCreateInstance(clsID, NULL, CLSCTX_LOCAL_SERVER, IID_IUnknown, (void **)&lpUnk);
if (FAILED(hr)) throw SomeException;
//
_Application *app; //Address _Application
hr = lpUnk->QueryInterface(__uuidof(_Application), (void **) &app);
lpUnk->Release();
if (FAILED(hr)) throw SomeException;
// Do stuff with the app object
app->Release(); // Then release
Вы можете несколько «отключить» это, используя шаблон-обертку CComPtr для надежного выполнения выпуска с его деструктором, когда он выходит из области видимости:
CComPtr<IUnknown> lpUnk;
hr = CoCreateInstance(clsID, NULL, CLSCTX_LOCAL_SERVER, IID_IUnknown, (void **)lpUnk);
if (FAILED(hr)) throw SomeException;
//
CComPtr<_Application> app; //Address _Application
hr = lpUnk->QueryInterface(__uuidof(_Application), (void **) &app);
if (FAILED(hr)) throw SomeException;
//
// Do stuff with the app object
Обратите внимание, что указатель _Application является примером использования одной из структур из файла .tlh.