gpt4 book ai didi

C# 应用程序在调用 COM 类的方法时崩溃

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:00:01 26 4
gpt4 key购买 nike

我有一个调用 COM 类的 C# Winforms 应用程序。使用 Visual Studio 进行调试时,它进入 c++ 代码并返回 S_OK,但是当函数返回时,Visual Studio 挂起并且应用程序崩溃。我必须结束 VS 进程上的进程以停止程序运行。如果我在 visual studio 之外运行应用程序,应用程序就会崩溃。

一切正常,我不知道我可能做了什么导致这个问题。

感谢任何帮助。谢谢

Sj

这是接口(interface)定义

typedef struct
{
long ExpiryData
BSTR IssuedBy;
} LicenceData;

[
object,
uuid (5A734F95-EABE-440B-8B7E-0F73538A24AC),
pointer_default(unique),
helpstring("ILicenceReader Interface"),
]
interface ILicenceReader : IDispatch
{
HRESULT ReadLicenceFile ([in, out]LicenceData* plicenceData, LPCTSTR filePath);
};

[
uuid(C2833A21-6586-4648-ABC8-D42BC3225699)
]
coclass LicenceReader
{
[default] interface ILicenceReader;
};

我已经引用了 COM dll 并允许 VS 生成 Interop 和在 c# 应用程序中的用法:

LicenceData data = new LicenceData();

ILicenceReader reader = new LicenceReader();

reader.ReadLicenceFile(ref data, filePath);

感谢您的帮助。

最佳答案

我敢打赌,COM 子系统正在尝试解码分配在堆栈上的 BSTR,或者可能是分配给堆栈上的智能指针。

BSTR 必须使用 SysAllocString 分配。结果可以按原样返回,因为它不在堆栈中,并且不会尝试错误地释放它。

如果您使用智能指针 BSTR 类,例如 CComBSTR 或 _bstr_t,则需要通过 Detach 设置 IssuedBy 成员。 CComBSTR::Detach() 将返回指向 BSTR 的指针,并且当 CComBSTR 的本地实例超出范围时不会尝试释放它。

plicenceData->IssuedBy = CComBSTR("Some Dude").Detach();

另一种可能性是您尝试在您的 COM 类中执行类似 plicenceData = new plicenceData 的操作,覆盖传入的实例。那是行不通的。

最后,几乎 COM 函数在完成并返回后失败的唯一原因是编码问题。它是 C# 代码和被调用的 C++ 之间的层,它试图跨单元和可能的进程边界转换数据。您需要确保严格遵守 COM 规则,以允许编码完成其工作。

所以,仔细检查你所有的指针。它们是在堆栈上还是在堆上?他们需要在堆上。是否所有 BSTR 均已适当分配?使用智能 BSTR 类通常会有很大帮助,但请记住您不能返回原始成员。按照预期使用这些类。

关于C# 应用程序在调用 COM 类的方法时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10020272/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com