Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ DLL设计:DLL需要访问一些应用程序函数/数据_C++_C_Visual C++_Dll - Fatal编程技术网

C++ DLL设计:DLL需要访问一些应用程序函数/数据

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

我有一个带有一系列函数的DLL。到目前为止,一切都很好,这就是DLL的用途。 但是,我的DLL中的某些函数需要从加载DLL的应用程序调用函数(或访问数据)

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代码不正确,因为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:没错,它允许我有一个应用程序,它可以自动更新自己的一部分,而无需更新整个应用程序。