为了将 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 的明智方法吗?