【问题标题】:Can we use C++/Cx inside a static lib (Metro Style)我们可以在静态库中使用 C++/Cx(Metro 风格)吗
【发布时间】:2012-06-17 10:41:57
【问题描述】:

我正在尝试将本机 sdk 移植到 Windows RT 并帮助我实现缺少的功能来模拟注册表访问,因此我创建了一个静态库(文件->新建->项目...->静态库(Metro 风格的应用程序),我已经声明了这样的函数:

// WinRT stuff
#include <windows.storage.h>
#include <wrl/client.h>
#include <wrl/wrappers/corewrappers.h>

using namespace Microsoft::WRL;
using namespace Microsoft::WRL::Wrappers;
using namespace ABI::Windows::Storage;
using namespace ABI::Windows::Foundation;

LSTATUS
APIENTRY
RegOpenKeyExW(
    _In_ HKEY hKey,
    _In_opt_ LPCWSTR lpSubKey,
    _In_opt_ DWORD ulOptions,
    _In_ REGSAM samDesired,
    _Out_ PHKEY phkResult
    )
{
    LSTATUS ret = ERROR_SUCCESS;

    if (hKey == NULL)
        return ERROR_INVALID_HANDLE;
    if (phkResult == NULL)
        return ERROR_INVALID_PARAMETER;



    ABI::Windows::Storage::ApplicationDataContainer^ localSettings =
              ApplicationData::Current->LocalSettings;

...
}

但是,当我尝试编译时,我得到了这个错误:

1>c:\users\joe\documents\visual studio 2012\projects\lib1\lib1\oal.cpp(275): 
  error C3699: '^' : cannot use this indirection on type 
  'ABI::Windows::Storage::ApplicationDataContainer'

我已经检查并启用了使用 Windows 运行时扩展 (/ZW)(默认情况下),所以我想知道是否可以在静态库中使用 C++/CX?

【问题讨论】:

    标签: windows windows-runtime c++-cx microsoft-metro


    【解决方案1】:

    如果您在类型上使用 ABI 前缀,那么您指的是低级 C++ 类型。低级类型旨在与 WRL 一起使用,不能使用 ^ 运算符等 C++/CX 扩展。

    改用 ComPtr localSettings。

    【讨论】:

    • 谢谢,但我不想使用 WRL,因为它太冗长了,我已经在使用 ComPtr 和 com 接口了。我想要的是使用 C++/Cx。
    • 那么你不应该使用 ABI::,那只是用于 WRL 场景。 #include 也是如此
    【解决方案2】:

    好的,有人告诉我添加 In Librarian->General->Additional Dependecies : %(AdditionalDependencies) 并且我已经删除了 ABI:: 命名空间。现在它可以工作了;-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-14
      • 2012-09-10
      • 2019-06-13
      • 2013-06-28
      相关资源
      最近更新 更多