如何在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。
对于延迟加载,您需要加载api-ms-win-core-winrt-l1-1-0.dll
。这被列为Windows 8.1 API集,但是如果你查看RoInitialize的文档,它说最低支持的客户端是Windows 8.假设你使用LoadLibrary
和GetProcAddress
,它应该没关系。
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);
}
以上是关于如何在Mingw Gcc中声明和链接到RoInitialize,RoUninitialize,RoGetActivationFactory和HSTRING函数的主要内容,如果未能解决你的问题,请参考以下文章