1.静态调用MyCEDLL
在本章的第2节中介绍了调用DLL的两种方式:静态调用和动态调用,在下面的示例中就来演示使用静态方法调用上面创建的MyCEDLL.dll的步骤。
(1)使用VS2008智能设备MFC智能设备应用程序向导创建一个基于对话框的应
用程序CallDLLByStatic,编译环境设置为yincheng_OS。
(2)将MyCEDLL工程中的MyCEDLL.dll和MyCEDLL.1ib两个文件拷贝到本工程目录下,然后选择VS2008主菜单中的“项目ICalIDLLByStatic属性”项打开项目属性设置窗口,右边导航栏选择“配置属性J链接器I输入”,在该页框中的“附加依赖项”输入框中输入
MyCEDll.1ib,实际页面下图所示。
(3)将MyCEDLL工程的MyCEDLL.h头文件拷贝到本工程目录中,并且在CaIlDLLByStaticDl9.cpp文件中引用MyCEDLL.h头文件,代码如下: #include”MyCEDLL.h” 如图12-4
图12-4配置DLL调用
(4)在对话框窗体上放置一个“调用”按钮,通过单击该按钮来实现调用MyCEDLL中TestDll方法的功能。“调用”按钮的单击事件代码如程序
//演示静态调用DLL
void CCallDLLByStaticDlg::0nBnClickedBtnCall()
{
//TestDll函数为MyCEDLL.dll中的一个输出函数
TestDll();
}
(5)编译并下载到yincheng.OS\RelDir\VirtualPC_x86_Release在虚拟机中运行,单击“调用”按钮后效果如下。效果如图12-5
图12-5程序效果图
在上中介绍了以静态方式调用DLL的示例,在下面的示例中将继续介绍以动态方式调用DLL的方法步骤,这里还是以MyCEDLL.dll文件为例。
(1)使用VS2008智能设备IMFC智能设备应用程序向导创建一个基于对话框的应用程序CallDLLByDynamic,编译环境设置为yincheng_OS SDK)。
(2)在CallDLLByDynamicDlg.h文件中添加MyCEDLL文件中的TestDll函数定义,代码如下:
//定义MyCEDLL.dll中TestDll输出函数原型
typedef void(*pTestDII)(void);
(3)在对话框上放置一个“调用”按钮,用来调用MyCEDLL文件中的TestDll函数,该按钮的单击事件代码如下列所示。
//动态调用DLL示例
void CCallDLLByDynamicDlg::OnBnClickedBtnCall()
{
//1、加载DLL
HINSTANCEhModule = LoadLibrary(_T("MyCEDLL.dll"));
if (hModule == NULL)
{
AfxMessageBox(_T("加载DLL失败"));
return;
}
//得到MyCEDLL中TestDll函数地址
pTestDll pFun = (pTestDll)GetProcAddress(hModule,_T("TestDll"));
if ( pFun == NULL )
{
AfxMessageBox(_T("获取TestDll函数失败"));
}
else
{
//执行MyCEDLL中TestDll函数
pFun();
}
//3、释放DLL;
FreeLibrary(hModule);
}
(4)编译并下载到模拟器中运行,其运行界面如图l2-6所示。
图12-6程序运行效果
12.3.2 基于mfc的regular dll的创建
基于MFC的Regular DLL是用MFC类库编写的,其明显的特点就是在源文件里有一个继承CWinApp的类。该类动态链接库的输出函数具有如下形式:
extern ”C” EXPORT YourExportedFunction()j
如果没有extern”C”修饰,输出函数仅仅只能从C++代码中调用。
注意:所有从DLL输出的函数都应该以如下语句开始:
AFX—MANAGE—STATE(AfxGetStaticModuleState())
以上语句用来正确地切换MFC模块状态。Regular DLL能够被所有支持DLL技术的语言所编写的应用程序调用。在这种动态连接库中,它必须有一个从CwinApp类继承下来的类,DllMain函数被MFC所提供,不用显式地写出来。