视窗::存储:: ::的ApplicationData当前用C未找到++(Windows::Stor

2019-09-24 03:29发布

我的C ++代码,这是部分媒体基金会变换往往能够在Windows Store应用运行(地铁)

我修改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
    }

Answer 1:

因为你在GrayscaleTransform项目启用C ++ / CX会出现链接错误。 你的项目dllmain.cpp定义列出的入口点。 当您启用C ++ / CX,vccorlib被链接到您的模块,同时也定义了这些入口点。

因为在vccorlib的C ++ / CX基础设施创建了一个模块,你的切入点试图营造出别样模块发生的运行时错误。 只能有一个模块中的一个模块。

你需要做的GrayscaleTransform项目多了一些改变,以便能够使用C ++ / CX在它:

  • 从dllmain.cpp卸下四个DLL的*()函数。 你将依靠,而不是从vccorlib链接的定义。 需要注意的是注册类( ActivatableClass(CGrayscale)仍然是必需的。

  • 在C ++预处理器的选择,确保_WINRT_DLL在定义的“预处理器定义”。

  • 在链接输入选项,去掉“模块定义文件。”

请注意,您将需要混合C ++ / CX和“低级别” C ++使用WRL时要非常小心。 涉及C ++ / CX类型大多数表达式可以抛出异常,你必须确保没有异常都不放过越过边界ABI。

另外,考虑不使用C ++ / CX和不使用WRL整个项目。 这将是更详细的,但如果你已经使用WRL该项目的其他部分,它可能更有意义。



文章来源: Windows::Storage::ApplicationData::Current Not Found in C++