如何在Mingw Gcc中声明和链接到RoInitialize,RoUninitialize,RoGetActivationFactory和HSTRING函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Mingw Gcc中声明和链接到RoInitialize,RoUninitialize,RoGetActivationFactory和HSTRING函数相关的知识,希望对你有一定的参考价值。

更新:在roapi.h中添加了RoInitialize的样子

我正在编写纯C ++ 11 WinRT库。我不使用WRL或C ++ / CX(显然,如果我想要纯C ++ 11)。

我得到了我的代码来编译和运行MSVC,但我想看看我是否可以在Mingw Gcc上编译和运行代码。具体来说,我使用的是从nuwen.net获得的Gcc 4.7.2。

此时我需要的是一种调用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,我仍然可以使用它

更新:这是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
答案

这些函数的导入库是runtimeobject.lib(MSDN文档未提及)。它可以在Windows SDK for Windows 8中找到。

另一答案

您需要链接的库是windowsapp.lib(只有这个库,删除所有其他库)。

Windowsapp.lib是一个“伞形”库,它为UWP API提供导出。链接到Windowsapp.lib将添加到您的应用程序依赖于所有Windows 10设备系列上的dll。

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。这被列为Windows 8.1 API集,但是如果你查看RoInitialize的文档,它说最低支持的客户端是Windows 8.假设你使用LoadLibraryGetProcAddress,它应该没关系。 https://msdn.microsoft.com/en-us/library/windows/desktop/dn933214(v=vs.85).aspx

实现该方法的实际DLL是combase.dll,但它们使用新的API DLL作为间接级别,以便将来可以自由更改或更新这些DLL。

为了将来参考,Windows 10(UWP)的API集列在Windows 8(和8.1)的API集的单独页面上。存根DLL(用于延迟加载)是相同的。 https://msdn.microsoft.com/library/windows/desktop/mt186421

另一答案

如果您没有包含RoInitialize的导入库,则需要使用LoadLibrary / GetProcAddress来解析类型。

另一答案

运行时链接如下:

#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

以上是关于如何在Mingw Gcc中声明和链接到RoInitialize,RoUninitialize,RoGetActivationFactory和HSTRING函数的主要内容,如果未能解决你的问题,请参考以下文章

mingw 安装和使用问题

怎样用gcc或者ld链接.dll文件

MinGW:如何在 Windows 上将 GCC/G++ 升级到版本 5?

如何在 cmd 或 bat 文件中链接 MinGW

如何在 Windows 上的 MinGW 中更新 GCC?

cmake:让mingw(gcc)生成MSVC可用的dll(.lib)----mark亲测有效