C++ 中未找到 Windows::Storage::ApplicationData::Current

Posted

技术标签:

【中文标题】C++ 中未找到 Windows::Storage::ApplicationData::Current【英文标题】:Windows::Storage::ApplicationData::Current Not Found in C++ 【发布时间】:2012-10-15 10:04:27 【问题描述】:

我的 C++ 代码,它是 Media Foundation Transform 的一部分,往往能够在 Windows Store App (Metro) 中运行

我修改C++ GrayscaleTransform 以包含以下代码。

但是,我的 C++ 代码无法找到命名空间 Windows::Storage

LPCWSTR zPath = Windows::Storage::ApplicationData::Current->TemporaryFolder->Path->Data();

我需要做任何额外的设置吗?

我可以通过打开使用 Windows 运行时扩展来编译它。

但是这样做,它会给我额外的链接错误和警告。

warning LNK4197: export 'DllGetActivationFactory' specified multiple times; using first specification 
warning LNK4197: export 'DllCanUnloadNow' specified multiple times; using first specification
warning LNK4197: export 'DllGetActivationFactory' specified multiple times; using first specification 
warning LNK4197: export 'DllCanUnloadNow' specified multiple times; using first specification
error LNK2005: _DllCanUnloadNow@0 already defined in dllmain.obj 
error LNK1169: one or more multiply defined symbols found

注释掉DllCanUnloadNow会产生运行时错误。

我在运行时中断

// GrayscaleTransform.dll!Microsoft::WRL::Details::ModuleBase::ModuleBase()  Line 155 + 0x46 bytes  C++

    ModuleBase() throw()
    
#ifdef _DEBUG
        // This indicates that there were two instances of the module created or race conditon during module creation
        // If you are creating object with new/delete please make sure that you haven't created more than one module 
        // and you disabled static initalization with __WRL_DISABLE_STATIC_INITIALIZE__
        // otherwise please initialize/create module in main()
        __WRL_ASSERT__(::InterlockedCompareExchangePointer(reinterpret_cast<void* volatile*>(&module_), this, nullptr) == nullptr &&
            "The module was already instantiated");

        SRWLOCK initSRWLOCK = SRWLOCK_INIT;
        __WRL_ASSERT__(reinterpret_cast<SRWLOCK*>(&moduleLock_)->Ptr == initSRWLOCK.Ptr && "Different value for moduleLock_ than SRWLOCK_INIT");
        (initSRWLOCK);
#else
        module_ = this;
#endif
    

【问题讨论】:

【参考方案1】:

出现链接器错误是因为您在 GrayscaleTransform 项目中启用了 C++/CX。您的项目定义了 dllmain.cpp 中列出的入口点。当您启用 C++/CX 时,vccorlib 会链接到您的模块中,并且它还定义了这些入口点。

出现运行时错误是因为 vccorlib 中的 C++/CX 基础结构创建了一个模块,而您的入口点尝试创建不同类型的模块。一个模块中只能有一个模块。

您需要对 GrayscaleTransform 项目进行更多更改才能在其中使用 C++/CX:

从 dllmain.cpp 中删除四个 Dll*() 函数。相反,您将依赖从 vccorlib 链接的定义。请注意,仍然需要类注册 (ActivatableClass(CGrayscale))。

在 C++ 预处理器选项中,确保在“预处理器定义”中定义了 _WINRT_DLL

在链接器输入选项中,删除“模块定义文件”。

请注意,在使用 WRL 混合 C++/CX 和“低级”C++ 时,您需要非常小心。大多数涉及 C++/CX 类型的表达式都可以抛出异常,您必须确保不允许任何异常跨越 ABI 边界。

或者,考虑不使用 C++/CX,而是在整个项目中使用 WRL。它会更冗长,但如果您已经在项目的其他部分使用 WRL,它可能更有意义。

【讨论】:

谢谢。按照你提到的 3 个步骤,它现在就解决了。

以上是关于C++ 中未找到 Windows::Storage::ApplicationData::Current的主要内容,如果未能解决你的问题,请参考以下文章

为啥 int 数组在 C++ 中未初始化为零?

如何抑制有关 C++ 中未使用变量的警告?

C++ 中未命名命名空间的使用

在子类中未检测到 C++ 纯虚函数

C++ 对类中未初始化的变量启用警告

Clang 没有报告 C++ 中未初始化的变量?