ActiveX 属性持久性

Posted

技术标签:

【中文标题】ActiveX 属性持久性【英文标题】:ActiveX Property Persistance 【发布时间】:2015-01-26 06:55:25 【问题描述】:

我有一个关于我正在开发的 ActiveX 控件的问题。我已经解决了大多数问题,但我被困在了一个真正的路障上。这个 ActiveX 正在被移植到其他软件中,所以我必须很好地实现属性页。我已经设法让一些持久性属性与一个问题一起工作。当我在属性页面中进行更改时,只要正在使用它的开发应用程序的应用程序打开,它就会更新并持续存在,但当我重新加载应用程序时它会恢复。我已将其范围缩小到开发应用程序没有意识到 ActiveX 已更改因此没有保存的事实。如果我进行了不相关的更改并保存程序,一切都很好,并且值按预期持续存在。我已经尝试了所有方法,但似乎无法让导入我的 ActiveX 的应用程序来实现它何时通过属性页发生更改。我想知道是否有人可以解决此类问题。在我看来,如果我可以强制 DoPropExchange() 它会起作用,但我不知道如何明确地调用它。

提前致谢 马特

感谢您的意见。我确实有 SetModifiedFlag() 但它不起作用。在戳它之后,我解决了这个问题,但现在我正在重定向我的问题。我已从 idl 文件分配接口中删除了上述有问题的属性,以防止加载 activex 的应用程序在其“连接列表”(特定于第 3 方应用程序)中显示该属性。看来该应用程序加载了所有界面进入这个列表,但这并不好,因为某些属性应该是持久的并且只能通过proppages修改。我尝试了所有的标志,如隐藏和本地,但仍然显示在列表中。当我从调度界面中删除它时,这就是我想要的它但不会发出 IsModified 的信号。我的新问题是用另一种方式为这样的实例定义属性,或者是否可以有一个辅助接口(我没有测试应用程序是否会看到这个接口,因为我不确定我将如何定义此接口)或仅在 proppage 和控件之间具有属性。或者是否有另一种方式来发出脏信号。控件的 OnMemberVariable 是正确的 ex ecuting 我从测试中知道,如果属性不在分配接口中,SetModifiedFlag() 似乎没有做任何事情

再次感谢

【问题讨论】:

【参考方案1】:

您需要将您的控件标记为“已修改”,以便其宿主可以检测到它并重新保存持久属性。在这种情况下,您的控件实现的IPersistXxx::IsDirty 将指示脏状态。

基于 MFC 的控件有 COleControl::SetModifiedFlag 用于此目的:

每当发生会影响控件持久状态的更改时调用此函数。例如,如果持久属性的值发生变化,请使用 bModified TRUE 调用此函数。

更新:要从属性浏览器中隐藏属性,您可以使用 nonbrowsable 属性。

使用 [nonbrowsable] 属性标记不应在属性浏览器中显示的接口或调度接口成员。

【讨论】:

以上是关于ActiveX 属性持久性的主要内容,如果未能解决你的问题,请参考以下文章

在组件的持久化中实现 `Auto` 属性

Spring HATEOAS RepresentationModel,无法设置属性链接,因为没有设置器,没有枯萎,它不是持久性构造函数的一部分

事务的四大属性ACID即事务的原子性(Atomicity)一致性(Consistency)隔离性(Isolation)持久性(Durability.。

Mongo - 忽略属性被持久化

Java 持久性/JPA:@Column 与 @Basic

如何使用 WCF 数据服务公开非持久属性?