C++ DLL设计:DLL需要访问一些应用程序函数/数据
我有一个带有一系列函数的DLL。到目前为止,一切都很好,这就是DLL的用途。 但是,我的DLL中的某些函数需要从加载DLL的应用程序调用函数(或访问数据) App.exe:C++ DLL设计:DLL需要访问一些应用程序函数/数据,c++,c,visual-c++,dll,C++,C,Visual C++,Dll,我有一个带有一系列函数的DLL。到目前为止,一切都很好,这就是DLL的用途。 但是,我的DLL中的某些函数需要从加载DLL的应用程序调用函数(或访问数据) App.exe: std::vector<SomeClass> objectsList; bool foo(void) { ... } LoadLibrary( "something.dll" ); __declspec(dllexport) void someFunction(void) { if ( fo
std::vector<SomeClass> objectsList;
bool foo(void)
{
...
}
LoadLibrary( "something.dll" );
__declspec(dllexport) void someFunction(void)
{
if ( foo() )
{
objectsList[2].someAttr = 1;
}
}
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_
}
}
LoadLibrary( "something.dll" );
setFoo = GetProcAddress(...);
setFoo(&foo);
据我所知,我的DLL代码不正确,因为DLL在链接时无法知道foo
或objectsList
。因此,我看到的唯一方式是:
something.dll:
std::vector<SomeClass> objectsList;
bool foo(void)
{
...
}
LoadLibrary( "something.dll" );
__declspec(dllexport) void someFunction(void)
{
if ( foo() )
{
objectsList[2].someAttr = 1;
}
}
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_
}
}
LoadLibrary( "something.dll" );
setFoo = GetProcAddress(...);
setFoo(&foo);
App.exe:
std::vector<SomeClass> objectsList;
bool foo(void)
{
...
}
LoadLibrary( "something.dll" );
__declspec(dllexport) void someFunction(void)
{
if ( foo() )
{
objectsList[2].someAttr = 1;
}
}
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_
}
}
LoadLibrary( "something.dll" );
setFoo = GetProcAddress(...);
setFoo(&foo);
我是对的,还是有更优雅的方式来做这类事情?以下是一些解决方案: 但是我仍然对任何关于这种设计的讨论感兴趣 谢谢一般来说,回调是一种优雅的解决方案 但听起来,DLL依赖于一个特定函数的存在和行为。如果是这样的话,那么您可能需要考虑您的应用程序和库之间是否有正确的分割。您的库是否将被多个应用程序使用?如果是,那么这个
foo()
业务将如何运作?如果不是,那么为什么它是一个DLL?一般来说,回调是一个优雅的解决方案
但听起来,DLL依赖于一个特定函数的存在和行为。如果是这样的话,那么您可能需要考虑您的应用程序和库之间是否有正确的分割。您的库是否将被多个应用程序使用?如果是,那么这个
foo()
业务将如何运作?如果不是,那么为什么它是DLL?这是回调函数的经典设计模式
只要您记录了库的使用者需要设置回调以及回调函数应该做什么,就可以了。这是回调函数的经典设计模式
只要您记录了库的使用者需要设置回调以及回调函数应该做什么,就可以了。有两种常见的解决方案:第一种是让DLL使用 某种回调;二是把功能和功能放在一起 根目录和DLL之间共享的数据放入单独的DLL中
有两种常见的解决方案:第一种是供DLL使用 某种回调;二是把功能和功能放在一起 根目录和DLL之间共享的数据放入单独的DLL中
它本身。通常,您会传递一个指向具有虚拟函数的对象的指针。通过这种方式,您可以进行面向对象的设计和回调,只需调用一个函数,而不是每个导出的函数调用一个函数。通常,您会传递一个指向具有虚拟函数的对象的指针。通过这种方式,您可以进行面向对象的设计和回调,使用单个函数调用,而不是每个导出函数调用一个函数。实际上,回调是实现这一点的最佳方式->显然,正如Oli提到的,依赖于外部实现的DLL可能是设计有缺陷的标志
就个人而言,我会尝试让我的DLL不依赖外部函数->除了在可执行位置注册的回调之外…实际上回调是最好的方法->显然,正如Oli提到的,依赖外部实现的DLL可能是有缺陷设计的标志
就我个人而言,我会尝试让我的DLL不依赖任何外部函数->除了在可执行位置注册的回调之外…Bleh为什么要使用动态加载?那很难看而且不便于携带。我的项目需要Boo:我嵌入了Wekbit/V8来创建一种空气环境。我可以创建浏览器窗口,并向这些窗口动态添加新的Javascript函数。JS函数包装在DLL中。它允许我的应用程序动态添加/更新JS功能。动态加载允许松散耦合,并允许基于组件的设计,从而使应用程序的总体设计更好…此外,您可以更新部分程序,而无需重新分发整个二进制文件…@MFH:没错,它允许我有一个应用程序,可以自动更新自己的一部分,而不更新整个应用程序?那很难看而且不便于携带。我的项目需要Boo:我嵌入了Wekbit/V8来创建一种空气环境。我可以创建浏览器窗口,并向这些窗口动态添加新的Javascript函数。JS函数包装在DLL中。它允许我的应用程序动态添加/更新JS功能。动态加载允许松散耦合,并允许基于组件的设计,从而使应用程序的总体设计更好…此外,您可以更新部分程序,而无需重新分发整个二进制文件…@MFH:没错,它允许我有一个应用程序,它可以自动更新自己的一部分,而无需更新整个应用程序。