请教mfc做窗口dll的方法

时间:2022-08-05 10:06:58
用mfc ActiveX做了,领导不同意,要做成dll,我实在不知道本来一个窗口显示的程序(还带工具栏按钮)怎么做成dll,请路过的帮帮我,
我先谢谢!
最好有比较详细一点的步骤说明。

12 个解决方案

#1


书上的一个例子。。


1、第一步创建一“MFC AppWizard (dll)”工程,接下来选择“Regular Dll using shared MFC DLL”,点击“Finish”。

  2、添加一对话框资源到工程中,从菜单中选择Insert->Resource,添加一“Dialog”

  选择“New”,至此对话框已添加到DLL工程中。

  3、为对话框添加一新类,如:CTest,基类为CDialog。

  4、在MFCDLL.cpp中(因创建的工程为MFCDLL)添加接口函数:

  
extern "C" __declspec(dllexport) void Show()
{
  AFX_MANAGE_STATE(AfxGetStaticModuleState());
  CTest test;
  test.DoModal ();
}

  别忘了在文件中添加: #include "Test.h":),大功告成,编译吧! 

  5、用VC新建一对话框工程,在一按钮点击事件中添加如下代码:

typedef void (WINAPI * TESTDLL)();
HINSTANCE hmod;
hmod = ::LoadLibrary ("mfcdll.dll");
if(hmod==NULL)
{
  AfxMessageBox("Fail");
}
TESTDLL lpproc;
lpproc = (TESTDLL)GetProcAddress (hmod,"Show");
if(lpproc!=(TESTDLL)NULL)
  (*lpproc)();
FreeLibrary(hmod);
  6、试试看,是不是DLL中对话框显示出来了:)

  测试环境:VC6.0+Win2000

#2


你平时怎么弄 对话框程序的就怎么 写MFC DLL
比如你有1个窗口类. 你把你要做的工作都做好.
然后 
写1个 函数 
void XXXXX()
{
   CXXXDlg xxxDlg;
   xxxDlg.Domodal();
}
注意 资源的切换.
如果你用MFC 扩展DLL 自己找资料去吧.

#3


若用MFC 扩展DLL,请问,应该如何在DLL中显示对话框。
俺用模式和非模式在DLL中调用(不是exe文件中调用DLL中的某个导出函数,而该函数中显示对话框),
总是出现相同的错误。

请问大家:如何解决?


引用 1 楼 lizhigang34 的回复:
书上的一个例子。。


1、第一步创建一“MFC AppWizard (dll)”工程,接下来选择“Regular Dll using shared MFC DLL”,点击“Finish”。

  2、添加一对话框资源到工程中,从菜单中选择Insert->Resource,添加一“Dialog”

  选择“New”,至此对话框已添加到DLL工程中。

  3、为对话框添加一新类……

#4


3楼你可能没有进行资源转换,你的对话框时DLL资源,调用DLL函数显示对话框时,要进行资源转换

#5


引用 2 楼 bingying19872008 的回复:
你平时怎么弄 对话框程序的就怎么 写MFC DLL
比如你有1个窗口类. 你把你要做的工作都做好.
然后
写1个 函数
void XXXXX()
{
CXXXDlg xxxDlg;
xxxDlg.Domodal();
}
注意 资源的切换.
如果你用MFC 扩展DLL 自己找资料去吧.

同意!

#6


引用 4 楼 bingying19872008 的回复:
3楼你可能没有进行资源转换,你的对话框时DLL资源,调用DLL函数显示对话框时,要进行资源转换


请问:如何资源转化啊?

我做了另一个Demo,可是到处DlL 中的对话框,该对话框没有加载ActiveX控件。在这个Demo中,我是在EXE中静态加载DLL的。

但是,目前我的另一个Demo中,是通过LoadLibrary来加载DlL的。 加载后,希望能够在DLL中 实现对话框 的输出。

#7


标准DLL:一般就只封装API或基本函数
MFC DLL:可以封装对话框,对话框内部可以使用MFC的函数.但是不能到出整个对话框.
        需要自己写1个一般的函数,在该函数中弹出对话框参见2楼.
MFC 扩展DLL 可以导出对话框.... 不过好像只能是MFC 程序使用.我对MFC 扩展DLL 不怎么了解.
一般就使用MFC DLL 这样 非MFC 程序也能使用,觉得比MFC 扩展DLL 方便1点.
资源MFC DLL进行资源转换也很方便
// extern "C" BOOL PASCAL EXPORT ExportedFunction()
// {
// AFX_MANAGE_STATE(AfxGetStaticModuleState());
// // 此处为普通函数体
                            CxxxDlg dlg;
                         dlg.domodal;
// }

#8


AFX_MANAGE_STATE(AfxGetStaticModuleState());
扩展DLL 好像没这个宏

#9


再补充:在第一Demo中,加载了ActiveX也可以正常显示。但是第二个Demo就说显示不了。而且
调用DoModal或Create时,就是蹦掉。

可能就是资源转化吧,但不清楚啊,请指点指点。

#10


 a、Non-MFC   DLL:指的是不用MFC的类库结构,直接用C语言写的DLL,其输出的函数一般用的是标准C接口,并能被非MFC或MFC编写的应用程序所调用。   
    
  b、Regular   DLL:和下述的Extension   Dlls一样,是用MFC类库编写的。明显的特点是在源文件里有一个继承CWinApp的类。其又可细分成静态连接到MFC和动态连接到MFC上的。   
    
  静态连接到MFC的动态连接库只被VC的专业般和企业版所支持。该类DLL应用程序里头的输出函数可以被任意Win32程序使用,包括使用MFC的应用程序。输入函数有如下形式:   
  extern   "C"   EXPORT   YourExportedFunction(   );   
  如果没有extern   “C”修饰,输出函数仅仅能从C++代码中调用。   
  DLL应用程序从CWinApp派生,但没有消息循环。   
    
  动态链接到MFC的规则DLL应用程序里头的输出函数可以被任意Win32程序使用,包括使用MFC的应用程序。但是,所有从DLL输出的函数应该以如下语句开始:   
  AFX_MANAGE_STATE(AfxGetStaticModuleState(   ))   
  此语句用来正确地切换MFC模块状态。   
    
  Regular   DLL能够被所有支持DLL技术的语言所编写的应用程序所调用。在这种动态连接库中,它必须有一个从CWinApp继承下来的类,DllMain函数被MFC所提供,不用自己显式的写出来。   
    
  c、Extension   DLL:用来实现从MFC所继承下来的类的重新利用,也就是说,用这种类型的动态连接库,可以用来输出一个从MFC所继承下来的类。它输出的函数仅可以被使用MFC且动态链接到MFC的应用程序使用。可以从MFC继承你所想要的、更适于你自己用的类,并把它提供给你的应用程序。你也可随意的给你的应用程序提供MFC或MFC继承类的对象指针。Extension   DLL使用MFC的动态连接版本所创建的,并且它只被用MFC类库所编写的应用程序所调用。Extension   DLLs   和Regular   DLLs不一样,它没有一个从CWinApp继承而来的类的对象,所以,你必须为自己DllMain函数添加初始化代码和结束代码。   
    
  和规则DLL相比,有以下不同:   
    
  1、它没有一个从CWinApp派生的对象;   
  2、它必须有一个DllMain函数;   
  3、DllMain调用AfxInitExtensionModule函数,必须检查该函数的返回值,如果返回0,DllMmain也返回0;   
  4、如果它希望输出CRuntimeClass类型的对象或者资源(Resources),则需要提供一个初始化函数来创建一个CDynLinkLibrary对象。并且,有必要把初始化函数输出;   
  5、使用扩展DLL的MFC应用程序必须有一个从CWinApp派生的类,而且,一般在InitInstance里调用扩展DLL的初始化函数。   

扩展DLL的资源转换 我不清楚...

#11


对不起,我有一点没说清楚:我不能用对话框,我想要的效果是,就像控件一样,主程序只需调用一些函数就可以把它(dll或什么)生成的显示窗口嵌入到主程序的窗体上。
我说一下我原来的做法:用mfc ActiveX做的,根据bmp图形数据绘制的openGL显示窗口,并有工具栏按钮操作窗口图形变换,生成.ocx文件,然后把.ocx拿到主程序处,按添加控件的方法直接就能在主程序窗体上显示了,主程序只调用了一个控件的方法把某些数据传递过去就行了。可是,拿到领导那里不能用,说是他的系统是win7,有一个注册权限的问题。所以才让我改用dll做,要求实现起来跟用ActiveX一样的。

我对dll能否实现上述的要求一点不清楚,现在不知道从那里下手,还请各位帮忙,谢谢回帖的各位!

#12


楼主最好找一篇文章系统的看看,自己理解下在问

#1


书上的一个例子。。


1、第一步创建一“MFC AppWizard (dll)”工程,接下来选择“Regular Dll using shared MFC DLL”,点击“Finish”。

  2、添加一对话框资源到工程中,从菜单中选择Insert->Resource,添加一“Dialog”

  选择“New”,至此对话框已添加到DLL工程中。

  3、为对话框添加一新类,如:CTest,基类为CDialog。

  4、在MFCDLL.cpp中(因创建的工程为MFCDLL)添加接口函数:

  
extern "C" __declspec(dllexport) void Show()
{
  AFX_MANAGE_STATE(AfxGetStaticModuleState());
  CTest test;
  test.DoModal ();
}

  别忘了在文件中添加: #include "Test.h":),大功告成,编译吧! 

  5、用VC新建一对话框工程,在一按钮点击事件中添加如下代码:

typedef void (WINAPI * TESTDLL)();
HINSTANCE hmod;
hmod = ::LoadLibrary ("mfcdll.dll");
if(hmod==NULL)
{
  AfxMessageBox("Fail");
}
TESTDLL lpproc;
lpproc = (TESTDLL)GetProcAddress (hmod,"Show");
if(lpproc!=(TESTDLL)NULL)
  (*lpproc)();
FreeLibrary(hmod);
  6、试试看,是不是DLL中对话框显示出来了:)

  测试环境:VC6.0+Win2000

#2


你平时怎么弄 对话框程序的就怎么 写MFC DLL
比如你有1个窗口类. 你把你要做的工作都做好.
然后 
写1个 函数 
void XXXXX()
{
   CXXXDlg xxxDlg;
   xxxDlg.Domodal();
}
注意 资源的切换.
如果你用MFC 扩展DLL 自己找资料去吧.

#3


若用MFC 扩展DLL,请问,应该如何在DLL中显示对话框。
俺用模式和非模式在DLL中调用(不是exe文件中调用DLL中的某个导出函数,而该函数中显示对话框),
总是出现相同的错误。

请问大家:如何解决?


引用 1 楼 lizhigang34 的回复:
书上的一个例子。。


1、第一步创建一“MFC AppWizard (dll)”工程,接下来选择“Regular Dll using shared MFC DLL”,点击“Finish”。

  2、添加一对话框资源到工程中,从菜单中选择Insert->Resource,添加一“Dialog”

  选择“New”,至此对话框已添加到DLL工程中。

  3、为对话框添加一新类……

#4


3楼你可能没有进行资源转换,你的对话框时DLL资源,调用DLL函数显示对话框时,要进行资源转换

#5


引用 2 楼 bingying19872008 的回复:
你平时怎么弄 对话框程序的就怎么 写MFC DLL
比如你有1个窗口类. 你把你要做的工作都做好.
然后
写1个 函数
void XXXXX()
{
CXXXDlg xxxDlg;
xxxDlg.Domodal();
}
注意 资源的切换.
如果你用MFC 扩展DLL 自己找资料去吧.

同意!

#6


引用 4 楼 bingying19872008 的回复:
3楼你可能没有进行资源转换,你的对话框时DLL资源,调用DLL函数显示对话框时,要进行资源转换


请问:如何资源转化啊?

我做了另一个Demo,可是到处DlL 中的对话框,该对话框没有加载ActiveX控件。在这个Demo中,我是在EXE中静态加载DLL的。

但是,目前我的另一个Demo中,是通过LoadLibrary来加载DlL的。 加载后,希望能够在DLL中 实现对话框 的输出。

#7


标准DLL:一般就只封装API或基本函数
MFC DLL:可以封装对话框,对话框内部可以使用MFC的函数.但是不能到出整个对话框.
        需要自己写1个一般的函数,在该函数中弹出对话框参见2楼.
MFC 扩展DLL 可以导出对话框.... 不过好像只能是MFC 程序使用.我对MFC 扩展DLL 不怎么了解.
一般就使用MFC DLL 这样 非MFC 程序也能使用,觉得比MFC 扩展DLL 方便1点.
资源MFC DLL进行资源转换也很方便
// extern "C" BOOL PASCAL EXPORT ExportedFunction()
// {
// AFX_MANAGE_STATE(AfxGetStaticModuleState());
// // 此处为普通函数体
                            CxxxDlg dlg;
                         dlg.domodal;
// }

#8


AFX_MANAGE_STATE(AfxGetStaticModuleState());
扩展DLL 好像没这个宏

#9


再补充:在第一Demo中,加载了ActiveX也可以正常显示。但是第二个Demo就说显示不了。而且
调用DoModal或Create时,就是蹦掉。

可能就是资源转化吧,但不清楚啊,请指点指点。

#10


 a、Non-MFC   DLL:指的是不用MFC的类库结构,直接用C语言写的DLL,其输出的函数一般用的是标准C接口,并能被非MFC或MFC编写的应用程序所调用。   
    
  b、Regular   DLL:和下述的Extension   Dlls一样,是用MFC类库编写的。明显的特点是在源文件里有一个继承CWinApp的类。其又可细分成静态连接到MFC和动态连接到MFC上的。   
    
  静态连接到MFC的动态连接库只被VC的专业般和企业版所支持。该类DLL应用程序里头的输出函数可以被任意Win32程序使用,包括使用MFC的应用程序。输入函数有如下形式:   
  extern   "C"   EXPORT   YourExportedFunction(   );   
  如果没有extern   “C”修饰,输出函数仅仅能从C++代码中调用。   
  DLL应用程序从CWinApp派生,但没有消息循环。   
    
  动态链接到MFC的规则DLL应用程序里头的输出函数可以被任意Win32程序使用,包括使用MFC的应用程序。但是,所有从DLL输出的函数应该以如下语句开始:   
  AFX_MANAGE_STATE(AfxGetStaticModuleState(   ))   
  此语句用来正确地切换MFC模块状态。   
    
  Regular   DLL能够被所有支持DLL技术的语言所编写的应用程序所调用。在这种动态连接库中,它必须有一个从CWinApp继承下来的类,DllMain函数被MFC所提供,不用自己显式的写出来。   
    
  c、Extension   DLL:用来实现从MFC所继承下来的类的重新利用,也就是说,用这种类型的动态连接库,可以用来输出一个从MFC所继承下来的类。它输出的函数仅可以被使用MFC且动态链接到MFC的应用程序使用。可以从MFC继承你所想要的、更适于你自己用的类,并把它提供给你的应用程序。你也可随意的给你的应用程序提供MFC或MFC继承类的对象指针。Extension   DLL使用MFC的动态连接版本所创建的,并且它只被用MFC类库所编写的应用程序所调用。Extension   DLLs   和Regular   DLLs不一样,它没有一个从CWinApp继承而来的类的对象,所以,你必须为自己DllMain函数添加初始化代码和结束代码。   
    
  和规则DLL相比,有以下不同:   
    
  1、它没有一个从CWinApp派生的对象;   
  2、它必须有一个DllMain函数;   
  3、DllMain调用AfxInitExtensionModule函数,必须检查该函数的返回值,如果返回0,DllMmain也返回0;   
  4、如果它希望输出CRuntimeClass类型的对象或者资源(Resources),则需要提供一个初始化函数来创建一个CDynLinkLibrary对象。并且,有必要把初始化函数输出;   
  5、使用扩展DLL的MFC应用程序必须有一个从CWinApp派生的类,而且,一般在InitInstance里调用扩展DLL的初始化函数。   

扩展DLL的资源转换 我不清楚...

#11


对不起,我有一点没说清楚:我不能用对话框,我想要的效果是,就像控件一样,主程序只需调用一些函数就可以把它(dll或什么)生成的显示窗口嵌入到主程序的窗体上。
我说一下我原来的做法:用mfc ActiveX做的,根据bmp图形数据绘制的openGL显示窗口,并有工具栏按钮操作窗口图形变换,生成.ocx文件,然后把.ocx拿到主程序处,按添加控件的方法直接就能在主程序窗体上显示了,主程序只调用了一个控件的方法把某些数据传递过去就行了。可是,拿到领导那里不能用,说是他的系统是win7,有一个注册权限的问题。所以才让我改用dll做,要求实现起来跟用ActiveX一样的。

我对dll能否实现上述的要求一点不清楚,现在不知道从那里下手,还请各位帮忙,谢谢回帖的各位!

#12


楼主最好找一篇文章系统的看看,自己理解下在问