0

为了将 Windows 平台功能整合到其他跨平台应用程序中,我在 Visual Studio 中制作了一个单功能 VC++ DLL,它使用 Windows.Management.Deployment.PackageManager 来获取所有已安装的 Windows 商店应用程序的一些详细信息。

该函数作为一个独立的应用程序运行良好,我可以使用 MSVC 成功构建与我的 MinGW 主应用程序正确链接的 DLL(我可以愉快地从 dll 中返回原始数据等) - 但任何尝试从 dll 执行函数包含与 PackageManager 相关的代码会使我的应用程序在运行时崩溃,并显示无用的代码 -529697949。

以下是一些可复制的最小代码块:

主应用程序中的 main.cpp:

#include <QCoreApplication>
#include "mylib/WindowsAppsLib.h"
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    auto hi = (Helpers::sayHi());

    qDebug() << (hi);

    return a.exec();
}

dll头文件:

#pragma once
#define WINDOWSAPPSLIB_API __declspec(dllexport)

namespace Helpers
{ 
extern "C" WINDOWSAPPSLIB_API const char* sayHi();
}

dll源码:

#include "stdafx.h"
#include <sddl.h>
#include <collection.h>
#include "WindowsAppsLib.h"
#include <windows.h>

#using <Windows.winmd>
using namespace Platform;
using namespace Windows::Foundation;
using namespace Windows::Foundation::Collections;
using namespace std;

const char* Helpers::sayHi()
{
    auto packageManager = ref new Windows::Management::Deployment::PackageManager();
    auto packages = packageManager->FindPackages();

    return "Hi!";
}

没有与 packagemanger 相关的两行,程序运行良好并打印“Hi!”。包含时,一旦调用 sayHi(),程序就会崩溃,代码为 -529697949。这两行本身就有它们的依赖关系,并且不会导致异常。

关于我如何进行调查的任何线索?我无法摆脱这个系统的任何东西都让我更接近于识别问题。这是从普通 C++ MinGW 应用程序中访问 Windows.Management.Deployment.PackageManager 的明智方法吗?

4

0 回答 0