高手们都哪去了呀。
版主、prog_st、vcmfc什么的,你们都去哪了?
相信这个问题是程序设计中普遍存在的一个问题,大家研究一下如何解决?

解决方案 »

  1.   

    回:zeroweb(我不想再做软件了) 
    对,这就需要大家不要吝啬,积极讨论了!
      

  2.   

    对,这是普遍的问题,余在网上撒了大把网,还是没碰到大牛,不过,相信是比较easy的事。首先在DLL文件中添加做好的类文件,然后在要导出的类和函数前加定义语句,至于其它地方怎么写,现在还不是很清楚,比如DLL文件的.h文件要不要动?导出类中的函数,在vb中怎么调用?这都是很让人pp的事,很希望大家(尤其是高手大牛们)热情参与讨论,给余们托起一颗指路星星来
    ,呵呵,期待大家!
      

  3.   

    回: solarlee(清早跑步的鸟) 
    生成DLL大多数书上都有的,可以参考一下。我目前的问题主要集中在,在DLL中能否基于文档、视图进行开发程序。
      

  4.   

    能,可以用Regular DLL,把资源都封装到DLL里,就通过一个函数比如void OpenXXWindow()之类的接口调用,这样做很显然因为用了Regular DLL 所以可以被其他语言调用
      

  5.   

    更正一下,看了看我的源代码,使用的是Extern DLL,Regular DLL能不能用不能确定,例子如下
    举例:
    下面的函数就是一个DLL接口函数
    void OpenChildWindow()
    {
    HINSTANCE t_hInstOld = AfxGetResourceHandle();
    AfxSetResourceHandle(TestDLL.hModule);
    //设置资源句柄,在doc/view处理时都要考虑到资源的问题,可能会和主程序的资源发生冲突
    //资源冲突可以通过设置和释放资源句柄来实现,但是消息号就不大好处理,
    //建议整个应用统一分配消息号,有些消息号可以做成共享资源,在各个模块之间共享,
    //就象IDOK,IDCANCEL一样
    CDocTemplate*pDocTemp;
    POSITION p=AfxGetApp()->GetFirstDocTemplatePosition();
    CString text;
    BOOL HasFound=FALSE;
    while(p!=NULL)
    {
    pDocTemp=AfxGetApp()->GetNextDocTemplate(p);
    pDocTemp->GetDocString(text,CDocTemplate::filterName);
    if(text==DOCFILTERNAME)
    //DOCFILTERNAME是个宏,代表一个字符串
    {
    HasFound=TRUE;
    break;
    }
    }
    if(!HasFound)
    {
    CMultiDocTemplate* pDocTemplate;
    pDocTemplate = new CMultiDocTemplate(
    IDR_MANAGER,
    RUNTIME_CLASS(CXXDoc),
    RUNTIME_CLASS(CXXWnd), 
    RUNTIME_CLASS(CXXView));
    //这是DLL中定义好的三个类
    AfxGetApp()->AddDocTemplate(pDocTemplate);
    pDocTemp=pDocTemplate;
    }
    CMDIFrameWnd* pMainWnd=(CMDIFrameWnd*)AfxGetMainWnd();
    /* BOOL bNew=TRUE;
    //g_pToolBar是个公有变量,初始化为NULL
    if(g_pToolBar!=NULL)
    if(::IsWindow(g_pToolBar->m_hWnd))
    bNew=FALSE; if(bNew)
    {
    g_pToolBar=new CToolBar;
    g_pToolBar->m_bAutoDelete=TRUE;
    CToolBar& wndToolBar=*g_pToolBar;
    if (!wndToolBar.CreateEx(pMainWnd,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_TOP
    |CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC) ||
    !wndToolBar.LoadToolBar(IDR_MANAGERTOOLBAR))
    TRACE0("Failed to create toolbar\n");
    else
    {
    wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
    pMainWnd->EnableDocking(CBRS_ALIGN_ANY);
    pMainWnd->DockControlBar(&wndToolBar);
    }
    }*/
    //上面一端是使用Toolbar,这里没有用ToolBar
    pDocTemp->OpenDocumentFile(NULL);
    AfxSetResourceHandle(t_hInstOld);//释放资源句柄
    }
      

  6.   

    回 : voidman() 
    你好象把CWinApp 初始化的代码,拉到自己的函数中,手工写了出来!
    现在的问题还只是单文档的,你如果用多文档都没有问题,我起单文档应该不会有什么问题的,我试试看。
      

  7.   

    主要是资源的问题,如果你的主应用和DLL中相同的资源号,比如有相同的Dialog号,不加那两句就可能出现资源冲突的问题(具体的表现是你想打开这个对话框时打开的是另一个)。麻烦的是消息号,比如菜单对应的消息,比如你的toolbar有一个消息和主应用的一个菜单消息号的值相等,你打开你的doc/view的实例,点击toolbar上的按钮,就可能触发主程序的函数,这不是你所希望的(在你的实例没有焦点的时候消息就会往上传到主应用),当然toolbar有个函数SetOwner可以指定消息具体发给某个窗口,在单文档中已经没有问题了,但是在多文档中,有一个模板可能有多个实例,就不能把toolbar绑定到某一个固定的窗口上,所以还得进一步处理,比较简单的方法就是各个模块协调,不要出现相同值的消息号,但是这样做有背于模块化的程序设计思想,增加了模块间的偶合,但是我还没找到好方法来解决,看看那位大侠能解决。
      

  8.   

    回: voidman() 
    我想在程序中使用工具条和状态条,你的示例程序编译后不能运行
    错误在 wndToolBar.EnableDocking(CBRS_ALIGN_ANY);执行时,
    能不能把你完整的程序发给我一份,我的EMAIL是 : [email protected]
    如果有单文档的例子就更好了!谢谢!
      

  9.   

    回复: voidman() 
    谢谢你!
    我的程序是Ext Dll ,现在也可以使用了!
    出错的错误,不是你的程序问题,是因为我的程序中使用了,AfxGetMainWnd()函数,此函数调用会用于主程序的窗口,而不是我期望的框架窗口,因此我把它改为 GetParentFrame()就可以了!
    而且还有一点,框架窗口的工具栏都不需要在这个函数里创建,为原来的方式一样就可以了!
    我现在要给分了!不知有没有别的方法了!