2011-04-30 75 views
0

我有一堆函数的DLL。到目前为止,这很好,这就是DLL的用途。 但是,我的DLL中的一些函数需要从加载该DLL的应用程序调用函数(或访问数据)。DLL设计:该DLL需要访问一些应用程序的功能/数据

APP.EXE:

std::vector<SomeClass> objectsList; 
bool foo(void) 
{ 
    ... 
} 
LoadLibrary("something.dll"); 

something.dll:

__declspec(dllexport) void someFunction(void) 
{ 
    if (foo()) 
    { 
     objectsList[2].someAttr = 1; 
    } 
} 

对于我所知道的,在不正确我的DLL的代码,因为DLL不能知道fooobjectsList在链接。所以,我看到的唯一方法是:

something.dll:

typedef bool fooType(void); 
fooType* pFooFunc; 
__declspec(dllexport) void setFoo(fooType* fooPtr) 
{ 
    pFooFunc = fooPtr; 
} 
__declspec(dllexport) void someFunction(void) 
{ 
    if ((*pFooFunc)()) 
    { 
     ... _same thing for objectsList_  
    } 
} 

APP.EXE:

LoadLibrary("something.dll"); 
setFoo = GetProcAddress(...); 
setFoo(&foo); 

我说得对,还是有更优雅的方式来做那种事?
一些解决方案在这里:a DLL need to access symbols of its application 但我仍然对这种设计的任何讨论感兴趣。

由于

+0

的Bleh你为什么要使用动态加载?这很丑,不便携。嘘。 – alternative 2011-04-30 23:02:33

+0

我的项目需要:我嵌入了Wekbit/V8来创建一种AIR环境。我可以创建浏览器窗口,并动态地向这些窗口添加新的Javascript函数。 JS函数包装在DLL中。它允许我的应用程序实时添加/更新JS功能。 – Antoine 2011-04-30 23:10:52

+0

动态加载可实现松耦合,并允许基于组件的设计,从而导致应用程序的整体更好的设计...此外,您可以更新部分程序而不必重新分配整个二进制文件... – MFH 2011-04-30 23:38:04

回答

0

通常,回调优雅的溶液。

但它听起来像你的DLL依赖于一个特定的特定功能的存在和行为。如果是这样的话,那么也许你需要考虑你的应用程序和你的库之间是否有正确的分割。您的图书馆是否将被多个应用程序使用?如果是,那么这个foo()业务如何运作?如果不是,那么为什么它是一个DLL?

0

这是一个回调函数的经典设计模式。

只要您记录库的使用者需要设置回调以及该回调函数应该执行的操作,就没有问题。

2

有两种常见的解决方案:第一种是为DLL使用 某种回调;第二种是将根和DLL之间共享的函数和 放入一个单独的DLL中。

1

通常你会传递一个指向具有虚函数的对象的指针。这样你就有了面向对象的设计和回调,只需要一个函数调用,而不是每个导出的函数。

0

实际上,回调是这样做的最好方法 - >显然,Oli提到了一个取决于外部实现的DLL,可能是一个有缺陷的设计的标志。

个人而言,我会尽量让我的DLL依赖于任何外部功能 - >除了可能从一个回调在executeable注册...

相关问题