主框架是我编写的, 负责调用指定目录下的插件. 插件种类很多. 所以
会有多个功能加入进来, 以DLL形式提供
比如: 功能A\功能B, 都有共有的属性(名字, ID, 当前值), 而这些属性需要共享给其他的功能, 所以我声明一个结构体链表, 保存这些属性//global.htypedef struct tagControlStruct
{
    TCHAR  szName[MAX_PATH];
    UINT id;
    VARIANT volume;
}ControlStruct;typedef struct tagGOLBAL_VAIRIABLE
{
    TCHAR  szAppPath[MAX_PATH];
    CList <ControlStruct, ControlStruct&> m_listControl;
    //等等, 其他变量
}GOLBAL_VAIRIABLE;在主框架中声明一个变量,
GOLBAL_VAIRIABLE m_stGlobalViariable;每加载一个DLL, 将这个全局变量传递过去, 提供他们使用.问题是这样: 如果以后需要增加一个全局变量, 全局变量结构体的大小改变, 其他的DLL也需要重新编译一次?  更加糟糕的是: 有些DLL是别人去开发的.所以, 怎么来解决这些问题, 还请大家发言表达看法! 谢谢!

解决方案 »

  1.   

    teli_eurydice(哭泣的仙人掌。) ?不是很明白
    在主程序中 添加回调函数? 那功能DLL又怎么知道有哪些回调函数呢? 不还是要把回调函数列表告诉功能DLL?还是存在日后添加的问题阿
      

  2.   

    肯定会存在改动的需求。实际中只能考虑如何让改动更小。比如,如果你能定义一组操作API做成接口,就可以隐藏数据结构。把接口指针传给dll.当增加新的数据,就定义一个新的接口,旧的库用旧的接口,新的库用新的接口。
      

  3.   

    是个很糟糕的运行方式.可以试试把这个都要用到的变量放在主框架里面,主框架增加接口(方法),让dll去调用.这样有个好处,增加的变量只在新的头文件里面,原来的dll是不知道这个变量,所以也不会调用.需要使用的dll一定要重新编译的,因为增加这个变量一定是要用到的,它本来就要重新写code的.不可能主框架增加功能,增加了一个变量,dll要使用,什么都不改.除非你的处理模式是固定的,而不管传进来的数据是什么.这样也很简单,接口不变(或者用一个基类做参数),主框架判断传入dll相应的数据.注意,这些变量一定要做好保护,注意线程同步.
      

  4.   

    holyeagle(一杯清茶)
     pkrobbie(pkrobbie) 这样不就是COM了?  增加接口, 变量对DLL是透明的
      

  5.   

    两种模式:
    1. 
             -界面+实际功能
    主程序: |
            |
             -COM接口(访问和修改主程序的变量)功能DLL: 查询接口, 然后进行相应的操作.2. 
    COM接口: 变量+接口函数
    主程序:  通过COM接口修改变量
    功能DLL: 通过COM接口修改变量第一种模式:
    SDI程序如何添加一个接口呢? 可能吗?第二种应该没什么问题还没有仔细考虑可行性1谢谢大家了, 欢迎继续发言:)
      

  6.   

    新的变量加进来, 肯定是有用的, 肯定是要反应的代码上的, 怎么能不重新编译dll/?用COM接口不变,主程序可以不重新编译,COM dll当然要重新编译了, 不然怎么改编它的实现/?
      

  7.   

    YanHuang82(炎黄):
    但是旧的DLL还是要可以继续使用阿? COM接口的版本不就是这个意思吗?
      

  8.   

    现在遇到2个头痛的问题:DLL的全局变量好像不能有 指针+新分配内存一般的COM好像也不能产生全局性的变量, 服务才可以(ATL加句话好像也可以)