由程序自已来判断,如保知道DLL里有某个函数. 如题.不用TRY...EXCEPT..END来获得. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 得到dll函数列表function GetProcList(DllFileName: String): String;var DataDirectory: TImageDataDirectory; P1: ^Cardinal; Base, NumberOfNames, AddressOfNames, i: Cardinal; NameList: TStrings; hModule: Cardinal;begin hModule := LoadLibrary(PChar(DllFileName)); NameList := TStringList.Create; try DataDirectory := PImageNtHeaders(Cardinal(hModule) + Cardinal(PImageDosHeader(hModule)^._lfanew))^.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT]; P1 := Pointer(hModule + DataDirectory.VirtualAddress + 16); Base := P1^; //输出函数的起始序号。一般为1。 P1 := Pointer(hModule + DataDirectory.VirtualAddress + 24); NumberOfNames := P1^;//输出函数名的指针的数组中的元素个数。 P1 := Pointer(hModule + DataDirectory.VirtualAddress + 32); AddressOfNames := P1^; //一个RVA,指向输出函数名的指针的数组。 begin //lpProcName参数指向函数名 for i := Base to NumberOfNames + Base - 1 do begin //按顺序在输出函数名中找 P1 := Pointer(hModule + AddressOfNames + (i - 1) * 4); NameList.Add(PChar(hModule + P1^)); //当前输出函数名 end; end; finally FreeLibrary(hModule); Result := NameList.DelimitedText; end; end; 上面的方法有内存泄漏,修改如下,不好意思:)function GetProcList(DllFileName: String): String;var DataDirectory: TImageDataDirectory; P1: ^Cardinal; Base, NumberOfNames, AddressOfNames, i: Cardinal; NameList: TStrings; hModule: Cardinal;begin hModule := LoadLibrary(PChar(DllFileName)); NameList := TStringList.Create; try DataDirectory := PImageNtHeaders(Cardinal(hModule) + Cardinal(PImageDosHeader(hModule)^._lfanew))^.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT]; P1 := Pointer(hModule + DataDirectory.VirtualAddress + 16); Base := P1^; //输出函数的起始序号。一般为1。 P1 := Pointer(hModule + DataDirectory.VirtualAddress + 24); NumberOfNames := P1^;//输出函数名的指针的数组中的元素个数。 P1 := Pointer(hModule + DataDirectory.VirtualAddress + 32); AddressOfNames := P1^; //一个RVA,指向输出函数名的指针的数组。 begin //lpProcName参数指向函数名 for i := Base to NumberOfNames + Base - 1 do begin //按顺序在输出函数名中找 P1 := Pointer(hModule + AddressOfNames + (i - 1) * 4); NameList.Add(PChar(hModule + P1^)); //当前输出函数名 end; end; Result := NameList.DelimitedText; finally FreeLibrary(hModule); NameList.Free; end;end; 请教各位,如何在桌面右键菜单上加入自己的菜单?见图 急救,在delphi中如何判断打印机是否安装。 listview的问题!(大家快来帮忙) 1st class控件... 在Delphi 7中用ADOConnection控件连接Oracle 9i的问题 关于Access的几个问题。 报表问题 delphi fortran 混合编程 在一个改写上下文菜单的DLL在98下注册成功但无效,是DLL的原因,还是系统的原因? Delphi frxreport打印数据库内容问题 有没有这样的数据关联下拉控件 大家帮帮忙,Delphi无法直接运行,程序界面一闪而过,但是编译exe文件成功.
function GetProcList(DllFileName: String): String;
var
DataDirectory: TImageDataDirectory;
P1: ^Cardinal;
Base, NumberOfNames, AddressOfNames, i: Cardinal;
NameList: TStrings;
hModule: Cardinal;
begin
hModule := LoadLibrary(PChar(DllFileName));
NameList := TStringList.Create;
try
DataDirectory :=
PImageNtHeaders(Cardinal(hModule) +
Cardinal(PImageDosHeader(hModule)^._lfanew))^.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT];
P1 := Pointer(hModule + DataDirectory.VirtualAddress + 16);
Base := P1^; //输出函数的起始序号。一般为1。
P1 := Pointer(hModule + DataDirectory.VirtualAddress + 24);
NumberOfNames := P1^;//输出函数名的指针的数组中的元素个数。
P1 := Pointer(hModule + DataDirectory.VirtualAddress + 32);
AddressOfNames := P1^; //一个RVA,指向输出函数名的指针的数组。
begin
//lpProcName参数指向函数名
for i := Base to NumberOfNames + Base - 1 do
begin
//按顺序在输出函数名中找
P1 := Pointer(hModule + AddressOfNames + (i - 1) * 4);
NameList.Add(PChar(hModule + P1^)); //当前输出函数名
end;
end;
finally
FreeLibrary(hModule);
Result := NameList.DelimitedText;
end;
end;
var
DataDirectory: TImageDataDirectory;
P1: ^Cardinal;
Base, NumberOfNames, AddressOfNames, i: Cardinal;
NameList: TStrings;
hModule: Cardinal;
begin
hModule := LoadLibrary(PChar(DllFileName));
NameList := TStringList.Create;
try
DataDirectory :=
PImageNtHeaders(Cardinal(hModule) +
Cardinal(PImageDosHeader(hModule)^._lfanew))^.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT];
P1 := Pointer(hModule + DataDirectory.VirtualAddress + 16);
Base := P1^; //输出函数的起始序号。一般为1。
P1 := Pointer(hModule + DataDirectory.VirtualAddress + 24);
NumberOfNames := P1^;//输出函数名的指针的数组中的元素个数。
P1 := Pointer(hModule + DataDirectory.VirtualAddress + 32);
AddressOfNames := P1^; //一个RVA,指向输出函数名的指针的数组。
begin
//lpProcName参数指向函数名
for i := Base to NumberOfNames + Base - 1 do
begin
//按顺序在输出函数名中找
P1 := Pointer(hModule + AddressOfNames + (i - 1) * 4);
NameList.Add(PChar(hModule + P1^)); //当前输出函数名
end;
end;
Result := NameList.DelimitedText;
finally
FreeLibrary(hModule);
NameList.Free;
end;
end;