找了几个,终于找到一个好用的
function GetDLLFileExports(
szFileName: PChar;
mStrings: TStrings
): Boolean;
var
hFile: THANDLE;
hFileMapping: THANDLE;
lpFileBase: Pointer;
pImg_DOS_Header: PImageDosHeader;
pImg_NT_Header: PImageNtHeaders;
pImg_Export_Dir: PImageExportDirectory;
ppdwNames: ^PDWORD;
szFunc: PChar;
i: Integer;
begin
Result := False;
if not Assigned(mStrings) then Exit;
hFile := CreateFile(szFileName, GENERIC_READ, FILE_SHARE_READ, nil,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if(hFile = INVALID_HANDLE_VALUE) then Exit;
hFileMapping := CreateFileMapping(hFile, nil, PAGE_READONLY, 0, 0, nil);
if hFileMapping = 0 then
begin
CloseHandle(hFile);
Exit;
end;
lpFileBase := MapViewOfFile(hFileMapping, FILE_MAP_READ, 0, 0, 0);
if lpFileBase = nil then
begin
CloseHandle(hFileMapping);
CloseHandle(hFile);
Exit;
end;
pImg_DOS_Header := PImageDosHeader(lpFileBase);
pImg_NT_Header := PImageNtHeaders(
Integer(pImg_DOS_Header) + Integer(pImg_DOS_Header._lfanew));
if IsBadReadPtr(pImg_NT_Header, SizeOf(IMAGE_NT_HEADERS)) or
(pImg_NT_Header.Signature <> IMAGE_NT_SIGNATURE) then
begin
UnmapViewOfFile(lpFileBase);
CloseHandle(hFileMapping);
CloseHandle(hFile);
Exit;
end;
pImg_Export_Dir := PImageExportDirectory(
pImg_NT_Header.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].
VirtualAddress);
if not Assigned(pImg_Export_Dir) then
begin
UnmapViewOfFile(lpFileBase);
CloseHandle(hFileMapping);
CloseHandle(hFile);
Exit;
end;
// 63 63 72 75 6E 2E 63 6F 6D
pImg_Export_Dir := PImageExportDirectory(
ImageRvaToVa(pImg_NT_Header, pImg_DOS_Header, DWORD(pImg_Export_Dir),
PImageSectionHeader(Pointer(nil)^)));
ppdwNames := Pointer(pImg_Export_Dir.AddressOfNames);
ppdwNames := Pointer(ImageRvaToVa(pImg_NT_Header, pImg_DOS_Header,
DWORD(ppdwNames), PImageSectionHeader(Pointer(nil)^)));
if not Assigned(ppdwNames) then
begin
UnmapViewOfFile(lpFileBase);
CloseHandle(hFileMapping);
CloseHandle(hFile);
Exit;
end;
for i := 0 to pImg_Export_Dir.NumberOfNames - 1 do
begin
szFunc := PChar(ImageRvaToVa(pImg_NT_Header, pImg_DOS_Header,
DWORD(ppdwNames^), PImageSectionHeader(Pointer(nil)^)));
mStrings.Add(szFunc);
Inc(ppdwNames);
end;
UnmapViewOfFile(lpFileBase);
CloseHandle(hFileMapping);
CloseHandle(hFile);
Result := True;
end;
//调用示例
procedure TF_Main.btnTestClick(Sender: TObject);
begin
GetDLLFileExports('F:\光盘刻录\Reclib\librtmp.dll', Memo1.Lines);
end;
分享到:
相关推荐
描述进一步确认了这个项目是关于DLL输出函数的查看器,意味着它可以显示一个DLL中所有可供其他程序调用的函数列表。这在调试、软件开发和逆向工程中非常有用,因为它可以帮助开发者了解一个DLL的功能以及如何与之...
导入单元通常包含`GetProcAddress`函数的调用来动态获取DLL函数的地址,以及`@`运算符来获取函数指针。 5. 使用生成的PAS文件:在Delphi项目中,只需将生成的PAS文件引入到工程中,就可以像调用本地函数一样调用DLL...
总结来说,DLL函数查看器3.7是一款为Delphi开发者和其他Windows程序员设计的强大辅助工具,它提供了一种直观的方式来探索和理解DLL文件中的函数,对于开发、调试和优化Windows应用程序具有重要意义。通过深入学习和...
6. 错误处理:在调用DLL函数时,别忘了检查可能出现的错误,如DLL加载失败、函数地址获取失败等。确保适当释放资源并处理异常。 以上就是Delphi从外部DLL调用子窗体的基本过程。在实际应用中,可能还需要考虑线程...
总结来说,解决Delphi DLL导出函数多余的问题,主要通过精简导出列表、动态加载、代码重构、利用资源和元数据以及自动化工具等方法。根据具体情况选择合适的方式,可以提高程序效率,减少资源占用,同时保持良好的...
托管DLL是.NET Framework的一部分,它们依赖于.NET运行时环境执行,而非托管DLL则是用传统语言如C++、C#编写,不依赖.NET环境。C#可以创建非托管代码(如导出C风格的函数),以便被非.NET语言调用。 在C#中,要导出...
5. **调用DLL**:在需要使用钩子功能的应用程序中,通过LoadLibrary和GetProcAddress函数加载并获取DLL中的钩子函数,然后调用这个函数来安装钩子。 压缩包内的文件名称列表暗示了这是一个关于键盘钩子的示例项目:...
在Delphi的主应用程序中,我们可以直接在`uses`列表中加入DLL的单元文件,从而获得对DLL函数的访问。例如: ```delphi program MainApp; uses MyDLLUnit, // 引入DLL的单元文件 System.SysUtils; begin WriteLn...
4. **DLL函数调用约定**:Delphi默认使用`stdcall`调用约定,而VC的C++函数默认使用`cdecl`。如果DLL中的类方法使用了`virtual`关键字,那么调用约定可能会变成`thiscall`。确保调用约定与DLL中的定义一致非常重要,...
Delphi 使用 `GetProcAddress` 函数获取 DLL 中函数的地址,然后调用这些函数。VC++ 中则通常使用 `LoadLibrary` 和 `GetProcAddress` 类似的机制。 5. **样款(Sample)**:这个样款可能包括了 Delphi 和 VC++ 的...
标题中的"delphi avicap32.dll dll文件"指的是在Delphi编程环境中使用的动态链接库(DLL)文件,avicap32.dll。这个文件是Windows操作系统中用于视频捕获和处理的核心组件,通常用于开发涉及到摄像头或者视频输入...
在本文中,我们将深入探讨如何使用Delphi 7开发一个能够获取Windows系统当前运行进程列表并具有结束进程功能的任务管理器。Delphi是一款强大的面向对象的编程环境,它基于Pascal语言,尤其适合开发Windows应用程序。...
1. **声明DLL函数**:在Delphi工程中,你需要在单元文件(.pas)中声明DLL中的函数。这通常使用`function`或`procedure`关键字,加上`external`关键字,并指定DLL的名称和函数名。例如: ```pascal function ...
在Delphi中,我们可以创建DLL项目,定义接口,实现通达信的API函数,然后在其他Delphi应用程序中通过导入库来调用这些函数,获取或操作通达信的数据。 文件列表中的"**D4Tdx.dpr**"是Delphi项目的主源文件,它包含...
在提供的文件列表中,"test.dll"是待加载的DLL文件,"Project1.dpr"是Delphi项目文件,可能包含了加载DLL的代码逻辑,"DLLUnit.pas"可能是实现DLL加载功能的单元文件,而"RSRC.RC"则是资源脚本文件,可能包含了DLL中...
- 在Delphi的GUI界面中,可以创建一个`TListBox`控件,调用上面的函数填充列表,显示网卡描述和IP地址信息。 - 对于多网卡环境,可能需要进一步处理IP地址,例如检查是否为IPv4或IPv6,是否为主机IP,是否是动态...
在调试阶段,可以通过设置项目依赖关系或使用`LoadLibrary`和`GetProcAddress`等API在宿主应用程序中加载和调用DLL函数。 5. **使用DLL**:在另一个Delphi应用程序中,使用`uses`指令引入DLL的接口单元,然后通过`...
在提供的文件列表中,"Project20.dpr"是Delphi项目的主文件,包含了项目入口点和编译指令。"Project20.dproj"是项目配置文件,保存了编译器设置、库路径等信息。"Project20.dproj.local"可能包含了开发者特定的本地...
总的来说,通过Delphi获取计算机硬件信息是一项涉及多个层面的任务,需要熟悉Windows API以及硬件驱动的交互机制。这不仅可以帮助开发者更好地理解系统的运行状态,也能为用户提供更加个性化的服务。
5. **在主程序中使用DLL**:在主程序中,我们首先需要包含DLL的头文件(通常为`.pas`或`.h`文件),然后通过`LoadLibrary`和`GetProcAddress`函数动态加载DLL,并获取接口函数的地址。一旦获取到函数指针,就可以像...