hur.cn - 华软网

 热门搜索

VC++ 如何将单文档程序封装到 Dll 中,以供其他程序调用?

  作者:未知    来源:网络    更新时间:2009/7/11
请教大家了:
   VC++ 如何将单文档程序封装到 Dll 中,以供其他程序调用,包括VC++,Delphi 等程序调用?

==========================================================================
详细如下:
   我有个单文档的程序,构造了个 CZoomScrollView:public CScrollView 类,在这个类中主要完成图像的缩放显示和鼠托操作等基本功能。现在我想在 Delphi 中重用该功能,在一个按钮事件里调用,只要能显示这个 CZoomScrollView 窗口就行了。如果能将该视图脱离 MFC 的文档-视图-框架结构独立显示最好,简单地说就好比动态创建一个 CButton 一样:

   CButton* pBttn = new CButton;
   pBttn->Create(...);

实在不行,就把这个单文档程序整个封装到 Dll 中,然后通过一个函数接口调用。

不知道我描述清楚了没?

先谢谢大家!

==========================================================================

---华软 网友回答---
跟加工程文件差不多。
把文件编译成DLL
在主程序调用这个DLL
---华软网友回复---
可以只使用框架+视图  只是需要动态创建它们 
---华软网友回复---
 >> heksn: 
    正是这个思路,框架+视图。  但是我不知道怎么动态创建它们,您能给举个例子吗? 
---华软网友回复---
参照SDI的代码,App中InitInstance()里
---华软网友回复---
C++">
CNewChildFrame  *m_pInpu ;

  if(m_pInput!=NULL)

  {

    m_pInput->MDIActivate();

    return;

  }

  m_pInput=new C New ChildFrame();

  CCreateContext context;

  context.m_pNewViewClass=RUNTIME_CLASS(CInputCertView);

  if(!m_pInput - >LoadFrame(IDI_ICON3,WS_MAXIMIZE|WS_OVERLAPPEDWINDOW,this,&context))

    return;

  m_pInput->ShowWindow(SW_SHOWMAXIMIZED);

  m_pInput->InitialUpdateFrame(NULL,true);


---华软网友回复---
1,创建完毕后,可以使用如下代码更新显示View:

SetActiveView(pNewView); 

pSplitter->RecalcLayout();

pNewView->OnInitialUpdate();

pNewView->SendMessage(WM_PAINT);

2,可以使用下面的代码删除某个View,比如旧的View:

pDoc->m_bAutoDelete = FALSE;

pOldView->DestroyWindow();

pDoc->m_bAutoDelete = TRUE; 

3,下面代码可以设置View的ID:

::SetWindowLong(pOldActiveView->m_hWnd, GWL_ID, 0);

::SetWindowLong(pNewView->m_hWnd, GWL_ID, pSplitter->IdFromRowCol(row, col)); 

4,GetDlgItem()也可以根据ID来得到一个View的指针,这个是很方便的; 

5.用m_pMainView->ResizeParentToFit(FALSE);来使得父窗口从新调整大小。

---华软网友回复---
多谢各位顶起!

但我现在的问题是如何在DLL 中实现:

void ShowWnd()
{
         CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CDemoDoc),
RUNTIME_CLASS(CFrameWnd),       
RUNTIME_CLASS(CEditView));



CDemoDoc* pDocument = new CDemoDoc;
CFrameWnd* pFrame = pDocTemplate->CreateNewFrame(pDocument, NULL);
if (NULL == pFrame)
{
AfxMessageBox("Create frame failed"); 
}

pDocTemplate->InitialUpdateFrame(pFrame, pDocument); // DLL 中到此报错!

        ....//省略
}

================================================================

上面这段代码在 SDI EXE 程序中调用很正常,一个窗口带一个视图,跟普通的 SDI 没什么差别,
但移植到 DLL 中,

   pDocTemplate->InitialUpdateFrame(pFrame, pDocument); // DLL 中到此报错!

================================================================

恳请大家帮个忙,怎么解决这个问题。



---华软网友回复---

    用MFC扩展dll导出CFormView类到单文档客户区
---华软网友回复---
=> clever101:

导出类,恐怕只能在 MFC 下可以用。

其他语言写的应用程序恐怕就调用不了了。我只是想做一个公共接口,简单点儿,就类似封装对话框一样封装这个视图。调用者调用后看见的就是一个弹出来的窗口而已。 
---华软网友回复---
引用 9 楼 houjbf 的回复:
=> clever101:

导出类,恐怕只能在 MFC 下可以用。

其他语言写的应用程序恐怕就调用不了了。我只是想做一个公共接口,简单点儿,就类似封装对话框一样封装这个视图。调用者调用后看见的就是一个弹出来的窗口而已。


     其它语言调用,那么使用com封装吧。
---华软网友回复---
看来,我还得学习啊!
---华软网友回复---
引用 7 楼 houjbf 的回复:
多谢各位顶起!

但我现在的问题是如何在DLL 中实现:

void ShowWnd()
{
  CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CDemoDoc),
RUNTIME_CLASS(CFrameWnd),  
……

我也遇到这个问题了,其实是上一步的Frame创建失败,我查出来是自愿问题,现在时解决了~~
---华软网友回复---
TO: <gindar>

我没有深入去看代码,最终换了其他方式实现。但你说“其实是上一步的Frame创建失败,我查出来是自愿问题,现在时解决了”,能告诉我你是怎么解决的吗?谢谢。      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。