注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
pxy94的个人空间 https://home.eeworld.com.cn/space-uid-21000.html [收藏] [复制] [分享] [RSS]
日志

WINCE下的DLL编程

已有 2526 次阅读2012-2-29 17:16 |个人分类:个人日志|

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,但如果使用TerminateProcessTerminateThread方法结束时则不调用。

以下是一个例子:

通过dll向导创建了一个dll工程名字为MyCEDLL

//MyCEDLL.h

#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

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章