在做智能设备开发上,一般是基于linux和wince,在wince的应用程序中,我们需要将很多自己写的模块函数封装成dll,以下是一些笔者·制作和使用dll一些总结。
一.生成DLL
1.新建一个vc的智能设备的win32智能设备项目,我建的是一个叫IoLIB的项目。
2.因为我的数控板配置的SDK是IMX35_CE6,所以我选择IMX35_CE6,这里选择你自己需要的SDK即可按完成。
3.选择DLL并选择导出符号。
4.打开IoLib.h,定义IoLib.h里的方法,由于我制作的DLL除了可以给vc给调用之外,还要给c#调用,所以要在我要暴露的函数外边包一层 extern "C" ,表明它是要按C的标准格式来编译。
#ifdef __cplusplus
extern "C"{
#endif
//要暴露的函数
#ifdef __cplusplus
}
#endif
实际代码如下
#ifdef IOLIB_EXPORTS
#define IOLIB_API __declspec(dllexport)
#else
#define IOLIB_API __declspec(dllimport)
#endif
// 此类是从 IoLib.dll 导出的
class IOLIB_API CIoLib {
public:
CIoLib(void);
// TODO: 在此添加您的方法。
};
extern IOLIB_API int nIoLib;
IOLIB_API int fnIoLib(void);
#ifdef __cplusplus
extern "C"{
#endif
IOLIB_API BOOL IOL_Init();
IOLIB_API BOOL IOL_Open();
IOLIB_API BOOL IOL_Close();
IOLIB_API BOOL IOL_Read(UINT16 iNum,UINT16 *pinState);
IOLIB_API BOOL IOL_Write();
#ifdef __cplusplus
}
#endif
5.定义IoLib.cpp里的方法,由于这个例子我是抽取以前的项目的某个例子,所以我只选取IOL_Init,IOL_Open,IOL_Read这几个函数。
// IoLib.cpp : 定义 DLL 应用程序的入口点。
//
#include "stdafx.h"
#include "IoLib.h"
#include <windows.h>
#include <commctrl.h>
#include <winioctl.h>
IOLIB_API HANDLE hIOFile = INVALID_HANDLE_VALUE;
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;
}
// 这是导出变量的一个示例
IOLIB_API int nIoLib=0;
// 这是导出函数的一个示例。
IOLIB_API int fnIoLib(void)
{
return 42;
}
// 这是已导出类的构造函数。
// 有关类定义的信息,请参阅 IoLib.h
CIoLib::CIoLib()
{
return;
}
IOLIB_API BOOL IOL_Init(){
return true;
}
IOLIB_API BOOL IOL_Open(){
// TODO: 在此添加额外的初始化代码
hIOFile = CreateFile(_T("IOL1:"),
GENERIC_WRITE|GENERIC_READ,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if(INVALID_HANDLE_VALUE == hIOFile)
{
return false;
}
else{
return true;
}
}
IOLIB_API BOOL IOL_Read(UINT16 iNum,UINT16 *pinState){
// TODO: 在此添加控件通知处理程序代码
int ret;
UINT16 stateArr;
UINT16 numState;
DWORD dwRead;
ret=ReadFile(hIOFile,&stateArr,2,&dwRead,NULL);
if(!ret){
return false;
}
else{
if(iNum>15){
//当IO口大于15时报错
return false;
}
numState = stateArr>>iNum;
*pinState = numState&0x0001;
return true;
}
}
IOLIB_API BOOL IOL_Close(){
if (hIOFile != INVALID_HANDLE_VALUE) {
CloseHandle(hIOFile); /* 关闭GPIO驱动 */
hIOFile = INVALID_HANDLE_VALUE;
}
return TRUE;
}
6. 点击重新生成,获得 dll 文件, lib 文件,和头文件,当其他项目要引用 IoLib.dll 时,会用到这三个文件,后面会细述