先用LoadLibrary加载DLL,再用GetProcAddress函数检取其输出函数的地址,获得其指针来调用。如: HANDLE hLibrary; FARPROC lpFunc; int PortValue; M hLibrary=LoadLibrary("PORTDLL.DLL"); //加载DLL if(hLibrary>31) //加载成功 { lpFunc=GetProcAddress(hLibrary,"PortIn"); //检取PortIn函数地址 if(lpFunc!=(FARPROC)NULL) //检取成功则调用 PortValue=(*lpFunc)(port); //读port端口的值 FreeLibrary(hLibrary); //释放占用的内存 } M
三、DLL应用实例源程序 1.直接内存访问的DLL源代码 //.DEF文件 LIBRARY MEMORYDLL DESCRIPTION 'DLL FOR MEMORY_READ_WRITE ' EXETYPE WINDOWS CODE PRELOAD MOVEABLE DISCARDABLE DATA PRELOAD MOVEABLE SINGLE HEAPSIZE 1024 //DLL无自己的堆栈,故没有STACKSIZE语句 EXPORTS WEP @1 residentname ReadMemory @2 WriteMemory @3
//.CPP文件 #include <windows.h>
int FAR PASCAL LibMain(HINSTANCE hInstance,WORD wDataSeg,WORD wHeapSize,LPSTR lpszCmdLine) { if(wHeapSize!=0) UnlockData(0); return 1; }
int FAR PASCAL MemoryRead(unsigned int DosSeg,unsigned int DosOffset) { WORD wDataSelector,wSelector; char far *pData; char value; wDataSelector=HIWORD((DWORD)(WORD FAR *)&wDataSelector); wSelector=AllocSelector(wDataSelector); //分配选择器 SetSelectorLimit(wSelector,0x2000); //置存取界限 SetSelectorBase(wSelector,(((DWORD)DosSeg)<<4)+(DWORD)DosOffset); //置基地址 pData=(char far *)((DWORD)wSelector<<16); value=*pData; FreeSelector(wSelector); //释放选择器 return (value); }
void FAR PASCAL MemoryWrite(unsigned int DosSeg,unsigned int DosOffset,char Data) { WORD wDataSelector,wSelector; char far *pData; wDataSelector=HIWORD((DWORD)(WORD FAR *)&wDataSelector); wSelector=AllocSelector(wDataSelector); SetSelectorLimit(wSelector,0x2000); SetSelectorBase(wSelector,(((DWORD)DosSeg)<<4)+(DWORD)DosOffset); pData=(char far *)((DWORD)wSelector<<16); *pData=Data; FreeSelector(wSelector); }
int FAR PASCAL WEP(int nParam) { return 1; }
2.端口读写I/O的DLL源代码 //.DEF文件 LIBRARY PORTDLL DESCRIPTION 'DLL FOR PORT_IN_OUT ' EXETYPE WINDOWS CODE PRELOAD MOVEABLE DISCARDABLE DATA PRELOAD MOVEABLE SINGLE HEAPSIZE 1024
//.CPP文件 #include <windows.h> #include <dos.h>
int FAR PASCAL LibMain(HINSTANCE hInstance,WORD wDataSeg,WORD wHeapSize,LPSTR lpszCmdLine) { if(wHeapSize!=0) UnlockData(0); return 1; }
int FAR PASCAL _export PortOut(int port,unsigned char value) { outp(port,value); return 1; }
int FAR PASCAL _export PortIn(int port) { int result; result=inp(port); return (result); }
int FAR PASCAL _export WEP(int nParam) { return 1; }