如何 AddRef() 一个 nsCOMPtr 用作输出参数?

发布于 2024-12-20 20:58:49 字数 942 浏览 3 评论 0原文

我的班级有一个成员:

class MyNativeXPCOMObject ... {
    ...
private:
    nsCOMPtr<nsISomeInterface> someInterface_;
    ...
};

我有执行此操作的方法:

NS_IMETHODIMP MyNativeXPCOMObject::GetSomeObject(nsISomeInterface** aSomeInterface) {
    NS_IF_ADDREF(someInterface_);
    *aSomeInterface = someInterface_;
    return NS_OK;
}

但是 Gecko 9 强制不允许您在 AddRef()Release() 上调用 <代码>nsCOMPtr<>s。所以现在我正在这样做:

NS_IMETHODIMP MyNativeXPCOMObject::GetSomeObject(nsISomeInterface** aSomeInterface) {
    NS_IF_ADDREF(someInterface_.get());  // <--- Added .get()!
    *aSomeInterface = someInterface_;
    return NS_OK;
}

但是直接访问原始指针让我感觉很脏。对于 getter 中的 out params,AddRef() 的正确方法是什么?

文档没有帮助。

I have a member for my class:

class MyNativeXPCOMObject ... {
    ...
private:
    nsCOMPtr<nsISomeInterface> someInterface_;
    ...
};

I have methods that do this:

NS_IMETHODIMP MyNativeXPCOMObject::GetSomeObject(nsISomeInterface** aSomeInterface) {
    NS_IF_ADDREF(someInterface_);
    *aSomeInterface = someInterface_;
    return NS_OK;
}

But Gecko 9 enforces that you're not allowed to call AddRef() or Release() on nsCOMPtr<>s. So now I'm doing this:

NS_IMETHODIMP MyNativeXPCOMObject::GetSomeObject(nsISomeInterface** aSomeInterface) {
    NS_IF_ADDREF(someInterface_.get());  // <--- Added .get()!
    *aSomeInterface = someInterface_;
    return NS_OK;
}

But directly accessing the raw pointer makes me feel dirty. What is the proper way to AddRef() for out params in getters?

The documentation was not helpful.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

暗藏城府 2024-12-27 20:58:49

您只需更改指令顺序:

*aSomeInterface = someInterface_;
NS_IF_ADDREF(*aSomeInterface);

*aSomeInterface 是一个原始指针,因此您可以在其上使用 NS_IF_ADDREF。大多数 Gecko 代码似乎就是这样做的。

You simply change the instruction order:

*aSomeInterface = someInterface_;
NS_IF_ADDREF(*aSomeInterface);

*aSomeInterface is a raw pointer so you can use NS_IF_ADDREF on it. That's how most Gecko code seems to do it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文