Как объявить и связать функции RoInitialize, RoUninitialize, RoGetActivationFactory и HSTRING в MinGW Gcc

обновлено: добавлено, как RoInitialize выглядит в roapi.h

Я нахожусь в процессе написания чистой библиотеки WinRT C++11. Я не использую WRL или C++/CX(очевидно, если я хочу чистый C++11).

я получил свой код для компиляции и запуска на MSVC, но я хочу посмотреть, могу ли я получить код для компиляции и запуска на Mingw Gcc. В частности, я использую Gcc 4.7.2, полученный из nuwen.net.

что мне нужно на данный момент, это способ вызова функций Windows API RoInitialize RoUnitialize RoGetActivationFactory и функции HSTRING WindowsCreateString, WindowsDuplicateString, WindowsDeleteString.

Я попытался скомпилировать эту программу на G++, но получил ошибку

extern "C"{
__declspec(dllimport)int __stdcall RoInitialize(int);
}
int main(){
    RoInitialize(1);
}

Я попытался скомпилировать, но получил

c:UsersjrbDesktop>g++ gccwinrt.cpp
C:UsersjrbAppDataLocalTempccy7y1V9.o:gccwinrt.cpp:(.text+0x1e): undefined
reference to `_imp__RoInitialize@4'
collect2.exe: error: ld returned 1 exit status

Если кто-нибудь может указать мне в правильном направлении, как объявить эти функции и какие библиотеки мне нужно связать, я был бы признателен. Даже если для этого требуется LoadLibrary / GetProcAddress, я все равно буду в порядке это

Update: вот как выглядит RoInitialize в заголовке roapi.h

ROAPI
_Check_return_
HRESULT
WINAPI
RoInitialize(
    _In_ RO_INIT_TYPE initType
);

ROAPI is just a define for __declspec(dllimport)
_Check_return_ is part of SAL (Secure Annotations Language?)
HRESULT maps to int32
WINAPI is a define for __stdcall
RO_INIT_TYPE is an enumeration so int should cover it

3 ответов


библиотека импорта для этих функций -runtimeobject.lib (который не упоминается в документации MSDN). Его можно найти в Windows SDK для Windows 8.


библиотека, которую вам нужно связать с windowsapp.lib (и только этот lib, удалите все остальные).

Windowsapp.lib-это "зонтичный" lib, который обеспечивает экспорт для API UWP. Ссылки на Windowsapp.lib добавит в ваше приложение зависимости от DLL, которые присутствуют на всех устройствах Windows 10 семьи.

https://msdn.microsoft.com/en-gb/windows/uwp/get-started/universal-application-platform-guide#writing-code

для загрузки задержки, вам нужно будет загрузить api-ms-win-core-winrt-l1-1-0.dll. Это указано как набор API Windows 8.1, однако, если вы проверите документацию для RoInitialize он говорит, что минимальный поддерживаемый клиент для Windows 8. Предполагая, что вы используете LoadLibrary и GetProcAddress, это не должно matter.
https://msdn.microsoft.com/en-us/library/windows/desktop/dn933214(v=vs. 85).aspx

фактическая DLL, что метод реализуется вcombase.dll, но они используют новые библиотеки API как уровень косвенности, чтобы они могли свободно изменять или обновлять их в будущем.

для дальнейшего использования наборы API для Windows 10 (UWP) перечислены на отдельной странице наборов API для Windows 8 (и 8.1). Заглушка DLL (для задержки загрузки) является тот же. https://msdn.microsoft.com/library/windows/desktop/mt186421


Если у вас нет lib импорта, который содержит RoInitialize, вам нужно будет использовать LoadLibrary/GetProcAddress для разрешения типов.