How to declare and link to RoInitialize,RoUninitialize,RoGetActivationFactory and HSTRING Functions in Mingw Gcc

拈花ヽ惹草 提交于 2019-12-07 00:02:19

问题


UPDATED: Added what RoInitialize looks like in roapi.h

I am in the process of writing a pure C++11 WinRT library. I do not use WRL or C++/CX(Obviously if I want pure C++11).

I got my code to compile and run on MSVC, but I want to see if I can get the code to compile and run on Mingw Gcc. Specifically I am using Gcc 4.7.2 obtained from nuwen.net.

What I need at this point is a way to call the Windows API Functions RoInitialize RoUnitialize RoGetActivationFactory and the HSTRING Functions WindowsCreateString, WindowsDuplicateString, WindowsDeleteString.

I tried compiling this program in G++ but got the error

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

I tried to compile, but got

c:\Users\jrb\Desktop>g++ gccwinrt.cpp
C:\Users\jrb\AppData\Local\Temp\ccy7y1V9.o:gccwinrt.cpp:(.text+0x1e): undefined
reference to `_imp__RoInitialize@4'
collect2.exe: error: ld returned 1 exit status

If anybody can point me in the right direction on how to declare these functions and what libraries I need to link to, I would appreciate it. Even if it required LoadLibrary/GetProcAddress I would still be ok with that

Update: Here is what RoInitialize looks like in the header 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

回答1:


The import library for these functions is runtimeobject.lib (which the MSDN documentation fails to mention). It can be found in the Windows SDK for Windows 8.




回答2:


The library you need to link against is windowsapp.lib (and only this lib, remove all others).

Windowsapp.lib is an "umbrella" lib that provides the exports for the UWP APIs. Linking to Windowsapp.lib will add to your app dependencies on dlls that are present on all Windows 10 device families.

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

For delay loading, you will need to load api-ms-win-core-winrt-l1-1-0.dll. This is listed as a Windows 8.1 API set, however if you check the documentation for RoInitialize it says the minimum supported client is Windows 8. Assuming you use LoadLibrary and GetProcAddress, it shouldn't matter.
https://msdn.microsoft.com/en-us/library/windows/desktop/dn933214(v=vs.85).aspx

The actual DLL that the method is implemented in is combase.dll, but they use the new API DLLs as a level of indirection so that they are free to change or update these in the future.

For future reference, the API sets for Windows 10 (UWP) are listed on a separate page to the API sets for Windows 8 (and 8.1). The stub DLL (for delay loading) is the same. https://msdn.microsoft.com/library/windows/desktop/mt186421




回答3:


If you don't have the import lib that contains RoInitialize, you'll need to use LoadLibrary/GetProcAddress to resolve the types.




回答4:


Run-time link it like this:

#include <roapi.h>

namespace
{
    FARPROC LoadComBaseFunction(const char* function_name)
    {
        static HMODULE const handle = ::LoadLibraryA("combase.dll");
        return handle ? ::GetProcAddress(handle, function_name) : nullptr;
    }

    decltype(&::RoInitialize) GetRoInitializeFunction()
    {
        static decltype(&::RoInitialize) const function = reinterpret_cast<decltype(&::RoInitialize)>(LoadComBaseFunction("RoInitialize"));
        return function;
    }
}


HRESULT RoInitialize(RO_INIT_TYPE init_type)
{
    auto ro_initialize_func = GetRoInitializeFunction();
    if (!ro_initialize_func)
        return E_FAIL;

    return ro_initialize_func(init_type);
}

Source



来源:https://stackoverflow.com/questions/16466641/how-to-declare-and-link-to-roinitialize-rouninitialize-rogetactivationfactory-an

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!