(编辑:jimmy 日期: 2024/12/23 浏览:2)
DLLIMPORT int Add(int a,int b){ return a+b;}DLLIMPORT int Sub(int a,int b){ return a-b;}DLLIMPORT int Mul(int a,int b){ return a*b;}DLLIMPORT int Div(int a,int b){ return a/b;}
DLLIMPORT int Add(int a,int b);DLLIMPORT int Sub(int a,int b);DLLIMPORT int Mul(int a,int b);DLLIMPORT int Div(int a,int b);
#include<Windows.h>#include<stdio.h>#include<stdlib.h>int main(){ typedef int(* FUNT)(int,int); //定义函数指针 HINSTANCE Hint = LoadLibrary("test.dll"); 调用先前写好的DLL if(Hint==NULL) { printf("DLL调用失败"); //测试 return 0; } FUNT ADD =(FUNT)GetProcAddress(Hint,"Add"); FUNT SUB =(FUNT)GetProcAddress(Hint,"Sub"); FUNT MUL =(FUNT)GetProcAddress(Hint,"Mul"); FUNT DIV =(FUNT)GetProcAddress(Hint,"Div"); int a=20,b=10; printf("和为%d\n",ADD(a,b)); printf("差为%d\n",SUB(a,b)); printf("积为%d\n",MUL(a,b)); printf("商为%d\n",DIV(a,b)); FreeLibrary(Hint); //释放 return 0;}
> EXPORTS Add @1 Div @2 Mul @3 Sub @4
> typedef struct _IMAGE_DATA_DIRECTORY> {> DWORD VirtualAddress; //导出表开始的地址 **注意是RVA的值**> RVADWORD Size; //导出表大小> }> IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
typedef struct _IMAGE_EXPORT_DIRECTORY { **0x00** DWORD Characteristics; //用不到 **0x04** DWORD TimeDateStamp; //时间戳. 编译的时间. 把秒转为时间.可以知道DLL的编译时间.此处和标准PE头的第二个成员一样 **0x08** WORD MajorVersion; **0x0a** WORD MinorVersion; **0x0c** DWORD Name; //指向该导出表文件名的字符串,也就是这个DLL的名称 存储的RVA 地址,需要转换 **0x10** DWORD Base; // 导出函数的起始序号 **0x14** DWORD NumberOfFunctions; //所有的导出函数的个数 **0x18** DWORD NumberOfNames; //以名字导出的函数的个数 **0x1c** DWORD AddressOfFunctions; // 导出的函数地址的 地址表 RVA 即函数地址表 **0x20** DWORD AddressOfNames; // 导出的函数名称表的 RVA 即函数名称表 **0x24** DWORD AddressOfNameOrdinals; // 导出函数序号表的RVA 即函数序号表} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;