我有一堆函数的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不能知道foo
或objectsList
在链接。所以,我看到的唯一方法是:
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 但我仍然对这种设计的任何讨论感兴趣。
由于
的Bleh你为什么要使用动态加载?这很丑,不便携。嘘。 – alternative 2011-04-30 23:02:33
我的项目需要:我嵌入了Wekbit/V8来创建一种AIR环境。我可以创建浏览器窗口,并动态地向这些窗口添加新的Javascript函数。 JS函数包装在DLL中。它允许我的应用程序实时添加/更新JS功能。 – Antoine 2011-04-30 23:10:52
动态加载可实现松耦合,并允许基于组件的设计,从而导致应用程序的整体更好的设计...此外,您可以更新部分程序而不必重新分配整个二进制文件... – MFH 2011-04-30 23:38:04