我有一个Windows .exe文件,但它的源代码丢失了。开发人员没有尽责并离开了我们公司。我认为这是一个Delphi/Pascal程序。开发者使用了许多库,但我不确定使用了哪些库。是否有工具可以告诉我用于制作该exe的库?
有没有工具可以帮助查找exe文件中使用的库?
我有一个Windows .exe文件,但它的源代码丢失了。开发人员没有尽责并离开了我们公司。我认为这是一个Delphi/Pascal程序。开发者使用了许多库,但我不确定使用了哪些库。是否有工具可以告诉我用于制作该exe的库?
有没有工具可以帮助查找exe文件中使用的库?
PACKAGEINFO
资源。您可以使用GetPackageInfo
函数来获取软件包信息表中的数据。请查看此示例代码,以了解如何使用此函数。program ResPACKAGEINFO;
{$APPTYPE CONSOLE}
uses
Windows,
Classes,
SysUtils;
function GetUnitFlagInfo(Flags: Byte):string;
begin
{ PackageUnitFlags:
bit meaning
-----------------------------------------------------------------------------------------
0 | main unit
1 | package unit (dpk source)
2 | $WEAKPACKAGEUNIT unit
3 | original containment of $WEAKPACKAGEUNIT (package into which it was compiled)
4 | implicitly imported
5..7 | reserved
}
Result:='';
if (Flags and ufMainUnit<>0) then
Result:='[Main Unit] ';
if (Flags and ufPackageUnit<>0) then
Result:=Result+'[Package Unit] ';
if (Flags and ufWeakUnit<>0) then
Result:=Result+'[Weak Unit] ';
if (Flags and ufImplicitUnit<>0) then
Result:=Result+'[implicitly imported] ';
if (Flags and ufWeakPackageUnit<>0) then
Result:=Result+'[$WEAKPACKAGEUNIT unit] ';
if (Flags and ufOrgWeakUnit<>0) then
Result:=Result+'[original containment of $WEAKPACKAGEUNIT]';
end;
procedure GetInfoPackageFlags(Flags:Cardinal);
begin
{ Package flags:
bit meaning
-----------------------------------------------------------------------------------------
0 | 1: never-build 0: always build
1 | 1: design-time only 0: not design-time only on => bit 2 = off
2 | 1: run-time only 0: not run-time only on => bit 1 = off
3 | 1: do not check for dup units 0: perform normal dup unit check
4..25 | reserved
26..27| (producer) 0: pre-V4, 1: undefined, 2: c++, 3: Pascal
28..29| reserved
30..31| 0: EXE, 1: Package DLL, 2: Library DLL, 3: undefined
}
if (Flags and pfModuleTypeMask = pfExeModule) then
Writeln('Type Exe')
else
if (Flags and pfModuleTypeMask = pfPackageModule) then
Writeln('Type Package')
else
if (Flags and pfModuleTypeMask = pfLibraryModule) then
Writeln('Type Library');
if (Flags and pfNeverBuild = 0) then
Writeln('Build with runtime packages')
else
Writeln('Build without runtime packages');
if (Flags and pfIgnoreDupUnits = 0) then
Writeln('perform normal dup unit check')
else
Writeln('Ignore Dup Units');
if (Flags and pfProducerMask = pfDelphi4Produced) then
Writeln('Producer Pascal');
if (Flags and pfProducerMask = pfV3Produced) then
Writeln('Producer pre-V4');
if (Flags and pfProducerMask = pfProducerUndefined) then
Writeln('Producer undefined');
if (Flags and pfProducerMask = pfBCB4Produced) then
Writeln('Producer c++');
if (Flags and pfConsumerMask = pfConsumerCompat) then
Writeln('Consumer Compatible')
else
if (Flags and pfConsumerMask = pfConsumerDelphi) then
Writeln('Consumer Delphi')
else
if (Flags and pfConsumerMask = pfConsumerBCB) then
Writeln('Consumer BCB');
end;
procedure PackageInfoCallback(const Name: string; NameType: TNameType; Flags: Byte; Param: Pointer);
begin
case NameType of
ntContainsUnit : Writeln(Format('Contains %s %s',[Name+#13#10,GetUnitFlagInfo(Flags)]));
ntRequiresPackage: Writeln(Format('Requires %s %s',[Name+#13#10,GetUnitFlagInfo(Flags)]));
end;
end;
procedure GetPackageResInfo(const FileName:string);
const
ResPACKAGEINFO='PACKAGEINFO';
var
FModule : Cardinal;
Flags : Integer;
begin
FModule := LoadLibraryEx(PChar(FileName), 0, LOAD_LIBRARY_AS_DATAFILE);
try
SysUtils.GetPackageInfo(FModule, nil, Flags, PackageInfoCallback);
GetInfoPackageFlags(Flags);
Writeln(GetPackageDescription(PChar(FileName)));
finally
FreeLibrary(FModule);
end;
end;
begin
try
GetPackageResInfo('yourApp.exe');
Readln;
except
on E:Exception do
Writeln(E.Classname, ': ', E.Message);
end;
end.
一款列出 Delphi 二进制文件中所使用单元的应用程序(类似于 RRUZ 的演示)是 XN 资源编辑器。据我所知,最新版本在 这里。以下示例屏幕截图(幸运地 :)))指向一个特定的第三方库:
XN或任何其他资源编辑器都可以用于将dfm资源导出到文件中,以便使用DFM Editor进行检查。
点击那个链接
下载三个文件:
a)exe文件
b)support dll文件
c)用于您前同事使用的Delphi版本的“字典”
提取所有三个文件
(如果没有rar文件提取器,请使用 7-zip)
最后,您可以在此页面找到一些更通用的指导方针以及其他工具的链接。
祝好运!