一个图书馆,我们使用我们的产品采用一个单独的访问。我敢肯定这是实施作为一个静态的实例(它是不是开放源)。这适用于一个单一的文件应用程序,但我们的应用程序可有多于一份文件加载。我想访问的实例是书面的东西,像这样:

Instance* getInstance() {
    static Instance* inst = new Instance();
    return inst;
}

在这样的情况,是否有某种方法强有力地创造多 一个实例?我唯一能想到的是有多过程和使用某种类型的IPC以把它绑在一起。我不能想到什么小哈克.

我已经要求供应商实行某种类型的会议令所以我可以有多种并发情况,但它们是很大的,我们都很小。

科里

编辑:

  • 该机Windows的机器
  • 全球静态基本上是一个大工厂。我想要一届会议的一些类型的这样我就可以很容易地说,"释放所有的资源,从本届会议"(有没有办法重新初始化的全球静,我知道的)

而不是尝试一些狡猾的诡计,以得到我想要什么,我要去换整个事情与我自己的类,并添加一届会议的关键每一个吸气。在内部,我会跟踪的已分配给加入我自己的释放方法返回的资源。这是次优的原因很多,但我不认为一个更好的主意。

感谢大家的伟大反馈。

有帮助吗?

解决方案

唯一我能想到的是以分类如果你们幸运地拥有单独的类的定义如:

class Document {
public:
    static Document* getInstance() {
        static Document inst;
        return &inst;
    }
    virtual ~Document();
protected:
    Document();
private:
    struct Impl;
    Impl *pImpl;
};

如果你可以类和子类,将有机会获得构造,然后您可以创建一个 instanceable 类如:

class MyDocument: public Document {
public:
    MyDocument(): Document() {
    }
};

这可能不是完全安全的,因为实施者可能已经取得了一些讨厌的假设。但它是一个想法或某些做法可能有一些工作的机会。与任何运的供应商可能是适合进行这一选择,如果你提到了...好运气。

其他提示

即使你们能够解决这个具体问题,同时具有一切都发生在进程内,我会担心,这一单独问题只是冰山的一角。图书馆显然不是专为你的方案。

隔离每个负DLL入其自身过程中的声音和非哈克给我,虽然这可能是昂贵的用于你。

我不能看到一个缺陷,在您的推理很遗憾。供应商已经做了一个决定,你是受其约束。他已经决定在一个实例中每个进程,所以如果你想多情况下,你必须具有多个进程的所有需要。

当然如果你假设他的决定,以限制是任意的,并没有很好的理由对它,你可以尝试破解它。的方式来开始在这条道路是要做一些拆卸/装配加强在调试器。如果你能确认他的实例工厂工作完全按照你们的结论上,可以毫无疑问的黑客一起的可替代,允许创作的多个实例。

但是当然的巨大风险,这种方法是,每一行代码都在供应商的代码依赖于他的决定有一个单一的实例,然后是一个定时炸弹准备炸毁在你的脸上。代码是看不见你。你准备打赌有零这样行吗?我知道什么是克林特*伊斯特伍德会说,在这样的情况;"你的感幸运的朋克,嗯?" :-)

有没有优雅的方式可以有多个实例,一个单独的对象在一个程序中的空间-但是这是一目的。在一般情况下,只使用一个单独的情况下,这是不可取的,有多个实例。如果供应商有实现他们的产品使用一个单一实例,可能有很好的理由的选择。

也许,如果你描述你的问题在更多的细节,可能还有其他的办法可能的。很难说,在信息的基础上提供。什么单独的对象?为什么你需要多个实例?

除了该进程间的东西你的建议,最好的黑客我能搞到复制dll到一个新的文件和手动加载新的dll和进口的所有功能使用的每一个实例。

我们希望这意味着静态变量不会之间的冲突的不同实例,因为它们在技术上是不同dll。但是有很多坏事这个解决方案,例如所有代码在dll正在对每个克隆版本,你不能使用的一个进图书馆,但已经加载dll和进口的所有功能。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top