||
WinCE DLL(动态链接库)编程
Wince的编程道路坎坷,我会坚持不懈,继续前行,^_^!!!!!!还是候老师的那句话:“勿在浮砂筑高台”,铭记于心。今天学习了wince下的dll编程,因为以前接触vc并不多,但知道动态链接库的原理,今天终于学会了怎么用它来进行编程,果不其然dll确实是一个非常好的技术。闲话少说,还是把今天所学的东西总结一下。
动态链接库(Dynamic Link Library)其实就是一种编译过的可执行的模块,它可以包含代码,数据,可用的资源。它可以被应用程序调用,也可以被dll调用,一般的扩展名为.dll其实系统中也有许多动态链接库,只是扩展名不一样,比如.drv, .sys, .fon等等,这些其实都是动态链接库。
但比较注意的地方就是在16位的windows中,dll有自己的数据段,因此所有需要调用同一个dll的应用程序都能够访问同一个全局变量或静态变量。但在32位的系统中,情况就不一样了,因为dll的映象被映射到每个进程的地址空间,该dll的所有数据将属于映射的进程,所以不能共享数据,但可以通过其他方法。
总结:
Dll的调用分为静态调用和动态调用
静态调用:不需要手动加载,开发人员建立一个dll文件时,会同时生成一个与之对应的.lib文件,在编写应用程序时,只要在evc下链接此.lib文件,当生成可执行程序后,运行时如果调用.dll中的函数,那么程序会通过查询lib文件就可以找到相应的函数了,可以说,lib文件就相当于dll的接口文件。
动态调用:动态调用就是开发人员通过API函数手工进行加载和卸载dll。
Dll的创建:
四种类型:
WINCE DLL:不使用MFC创建的DLL。可以被MFC或非MFC应用程序调用。
MFC常规DLL:使用MFC创建,按MFC链接方式的版本不同分为动态链接和静态链接。
MFC扩展DLL:更像应用程序,可以创建MFC的派生类,只能使用MFC的动态链接版本,并且只有使用了MFC动态链接版本的应用程序才能调用。
纯资源DLL:包括菜单,字符串,图标,位图或声音等等。
1. WINCE DLL的创建:
使用dll向导创建dll的框架
创建了框架程序之后可以看出,dll的入口点为DllMain函数,当新进程或线程访问dll时或不再使用dll时,都会调用DllMain,但如果使用TerminateProcess或TerminateThread方法结束时则不调用。
以下是一个例子:
通过dll向导创建了一个dll工程名字为MyCEDLL
#ifdef MYCEDLL_EXPORTS
#define MYCEDLL_API __declspec(dllexport)
#else
#define MYCEDLL_API __declspec(dllimport)
#endif
// This class is exported from the MyCEDLL.dll
class MYCEDLL_API CMyCEDLL {
public:
CMyCEDLL(void);
// TODO: add your methods here.
};
extern MYCEDLL_API int nMyCEDLL;
MYCEDLL_API int fnMyCEDLL(void);
MYCEDLL_API void test(void);
//MyCEDLL.cpp
// MyCEDLL.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include "MyCEDLL.h"
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
// This is an example of an exported variable
MYCEDLL_API int nMyCEDLL=0;
// This is an example of an exported function.
MYCEDLL_API int fnMyCEDLL(void)
{
return 42;
}
// This is the constructor of a class that has been exported.
// see MyCEDLL.h for the class definition
CMyCEDLL::CMyCEDLL()
{
return;
}
MYCEDLL_API void test(void)
{
MessageBox(NULL,_T("this is test"),_T("dll"),MB_OK);
}
每个输出函数前用__declspec(dllexport)修饰,如果用extern “C” __declspec(dllexport),也表示输出函数,它表明除了C++可以调用外,也可以被C调用。
接下来就是怎么调用
静态调用:
设置project|setting中的Link选项中在Object/Library Modules输入框中输入要链接的lib文件,如上例中的MyCEDLL.lib文件
将MyCEDLL.h, MyCEDLL.dll, MyCEDLL.lib文件拷到工程目录下。
把MyCEDLL.dll文件下载到相应的目标设备中
特别注意编译的时候要注意CPU的类型哦,^_^
这样就OK了
以下是测试程序:
建立一个MFC的一个Dialog工程,添加一个按钮,其相应函数如下
void CTestDllDlg::OnButton1()
{
test();//很简单的吧,^_^
}
最后在相应的TestDllDlg.cpp中引用相应的动态链接库的头文件MyCEDLL.h