扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
1、准备好要看函数的dell文件,打开Dll函数查看器3.5。
网站建设哪家好,找创新互联建站!专注于网页设计、网站建设、微信开发、小程序开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了河北免费建站欢迎大家使用!
2、单击“选择文件”按钮,选择你的文件。
3、点击竖早枝“打开”按钮。你会发睁旁现余敏,这个查看器列出了很多函数。
4、选择你的函数,如“SetMessageA”,然后点击左边的“+”,你就能看到这个函数的参数。
5、如果想在VB或易语言中声明这个函数,不需输入,可以这样:选择函数,右键单击,你就会发现有两个菜单,一个是“复制到VB声明”,一个是“复制到易语言声明”!
//建立一个vc6.0中建立一个win32console工程,打入如下代码。我在我的电脑上测试通过了。
#include "手洞stdafx.h"
#include windows.h
#include winbase.h
#include stdio.h
#include tchar.h
#include imagehlp.h
typedef PVOID (CALLBACK* PFNEXPORTFUNC)(PIMAGE_NT_HEADERS,PVOID,ULONG,PIMAGE_SECTION_HEADER*);
void printAllFuncName(char* fileName);//打印所有函数名称的函数声明
int main(int argc, char* argv[])
{
printAllFuncName("F:\\gdi32.dll");//打印gdi32.dll中所有函数名称,要打印别的dll中的函数,只要改变这个字符串。
getchar();
return 0;
}
void printAllFuncName(char* fileName){
LPWIN32_FIND_DATA lpwfd_first=new WIN32_FIND_DATA;/毕磨枯/接受findfirstfile的结构指针
HANDLE hFile,hFileMap;//文件句柄和内存映射文件句柄
DWORD fileAttrib=0;//存储文件属性用,在createfile中用到。
void* mod_base;//内存映射文件的起始地址,也是模块的起始地址
//首先取得ImageRvaToVa函数本来只要#include Dbghelp.h就可以使用这个函数,但是我的vc没有这个头文件
PFNEXPORTFUNC ImageRvaToVax=NULL;
HMODULE hModule=::LoadLibrary("DbgHelp.dll");
if(hModule!=NULL){
ImageRvaToVax=(PFNEXPORTFUNC)::GetProcAddress(hModule,"ImageRvaToVa");
if(ImageRvaToVax==NULL){
::FreeLibrary(hModule);
printf("取得函数失败\n");
return ;
}
}else{
printf("加载模块失败\n");
return ;
}
if(FindFirstFile(fileName,lpwfd_first)==NULL){//返回值为NULL,则文件不存在,游野退出
printf("文件不存在: %s ",fileName);
return ;
}else{
DWORD fileAttrib=lpwfd_first-dwFileAttributes;
}
hFile=CreateFile(fileName,GENERIC_READ,0,0,OPEN_EXISTING,fileAttrib,0);
if(hFile==INVALID_HANDLE_VALUE){
printf("打开文件出错!");
return ;
}
hFileMap=CreateFileMapping(hFile,0,PAGE_READONLY,0,0,0);
if(hFileMap==NULL){
CloseHandle(hFile);
printf("建立内存映射文件出错!");
return ;
}
mod_base=MapViewOfFile(hFileMap,FILE_MAP_READ,0,0,0);
if (mod_base==NULL)
{
printf("建立内存映射文件出错!");
CloseHandle(hFileMap);
CloseHandle(hFile);
return ;
}
IMAGE_DOS_HEADER* pDosHeader = (IMAGE_DOS_HEADER*)mod_base;
IMAGE_NT_HEADERS * pNtHeader =
(IMAGE_NT_HEADERS *)((BYTE*)mod_base+ pDosHeader-e_lfanew);//得到NT头首址
//IMAGE_NT_HEADERS * pNtHeader =ImageNtHeader (mod_base);
IMAGE_OPTIONAL_HEADER * pOptHeader =
(IMAGE_OPTIONAL_HEADER *)((BYTE*)mod_base + pDosHeader-e_lfanew + 24);//optional头首址
IMAGE_EXPORT_DIRECTORY* pExportDesc = (IMAGE_EXPORT_DIRECTORY*)ImageRvaToVax(pNtHeader,mod_base,pOptHeader-DataDirectory[0].VirtualAddress,0);
//导出表首址
PDWORD nameAddr=(PDWORD)ImageRvaToVax(pNtHeader,mod_base,pExportDesc-AddressOfNames,0);//函数名称表首地址每个DWORD代表一个函数名字字符串的地址
PCHAR func_name = (PCHAR)ImageRvaToVax(pNtHeader,mod_base,(DWORD)nameAddr[0],0);
DWORD i=0;
DWORD unti=pExportDesc-NumberOfNames;
for(i=0;iunti;i++){
printf("%s\n",func_name);
func_name = (PCHAR)ImageRvaToVax(pNtHeader,mod_base,(DWORD)nameAddr[i],0);
}
::FreeLibrary(hModule);
CloseHandle(hFileMap);
CloseHandle(hFile);
}
这个相对路径是滚宴闭你当前代码存放的位置.
实际应用中相对大裂路径比绝对路径实用多了.
比如你可以再代码路径祥亏上再创建一个文件夹,命令dll,里面放所有的dll文件
那么你此时路径".\\dll\\test.dll"
你可以发给我,我帮你看看
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流