Descobrir arquivos utilizados pelo exe
29/04/2008
0
existe algum aplicativo eu alguma solução para eu descobrir quais as .dlls e arquivos em geral mas principalmente dll que o meu .exe necessita para rodar?
obrigado.
Tappedroso
Post mais votado
30/04/2008
Quanto às dlls, eu não sei como verificar. Mas, com relação aos pacotes, o próprio delphi (2007) fornece essa informação através do menu Project -> Information for <nome do projeto>.
Esta unit que criei, baseada em um exemplo do livro Dominando o Delphi 7, do Cantú, copia todos os pacotes necessários para o seu .exe rodar para uma pasta dentro da pasta do projeto, todas as vezes que seu .exe é executado.
unit UntExtractDependencies; interface implementation uses SysUtils, Windows, ActiveX, XMLDoc, XMLDom, XMLIntf, Classes, Forms, Variants, Dialogs; var DependencyDoc: TXMLDocument; ModuleNode, ContNode, ReqNode: IXMLNode; procedure GetInfoPackage(const Name: String; NameType: TNameType; Flags: Byte; Param: Pointer); begin case NameType of ntContainsUnit: begin ContNode := ContNode.AddChild(´Unit´); ContNode.Attributes[´name´] := Name; ContNode := ContNode.ParentNode; end; ntRequiresPackage: begin ReqNode := ReqNode.AddChild(´Package´); ReqNode.Attributes[´name´] := Name; ReqNode := ReqNode.ParentNode; end; end; end; function GetInfoModule(HInstance: Longint; Data: Pointer): Boolean; var Flags: Integer; ModulePath, ModuleName: string; begin //Extrai os dados do módulo SetLength (ModuleName, 200); GetModuleFileName (HInstance, PChar (ModuleName), Length (ModuleName)); ModulePath := PChar(ModuleName); ModuleName := ExtractFileName(ModulePath); //Cria o nó referente ao módulo atual e adiciona suas propriedades ModuleNode := ModuleNode.AddChild(´Module´); ModuleNode.Attributes[´name´] := ModuleName; ModuleNode.Attributes[´location´] := ModulePath; ModuleNode.Attributes[´description´] := GetPackageDescription(PChar(ModuleName)); if Flags and pfDesignOnly = pfDesignOnly then begin ModuleNode.Attributes[´type´] := ´DesignTime´; end; if Flags and pfRunOnly = pfRunOnly then begin ModuleNode.Attributes[´type´] := ´RumTime´; end; //Cria os nós Contains e Requires ContNode := ModuleNode.AddChild(´Contains´); ReqNode := ModuleNode.AddChild(´Requires´); //Adiciona informações do pacote GetPackageInfo(HInstance, nil, Flags, GetInfoPackage); //Retorna ao módulo principal para a adição de um novo filho ModuleNode := ModuleNode.ParentNode; Result := True; end; procedure PrepareXMLDoc; begin //Prepara o documento XML DependencyDoc := TXMLDocument.Create(Application); DependencyDoc.DOMVendor := GetDOMVendor(´MSXML´); DependencyDoc.Options := [doNodeAutoCreate,doAttrNull,doAutoPrefix,doNamespaceDecl]; DependencyDoc.XML.Clear; DependencyDoc.Active := True; DependencyDoc.CreateElement(´xml´, ´´); DependencyDoc.Version := ´1.0´; DependencyDoc.Encoding := ´UTF-8´; ModuleNode := DependencyDoc.AddChild(´ModulesList´); end; procedure SaveDependencyFile; begin DependencyDoc.SaveToFile(extractfilepath(Application.ExeName) + ´DependencyList.xml´); DependencyDoc.Destroy; end; procedure CopyFiles(const Path: String); var cont: Integer; begin if Not(DirectoryExists(Path)) then begin CreateDir(Path); end; for cont := 1 to ModuleNode.ChildNodes.Count - 1 do begin CopyFile(PChar(Variants.VarToStr(ModuleNode.ChildNodes[cont].Attributes[´location´])), PChar(Variants.VarToStr(Path + ´\´ + ModuleNode.ChildNodes[cont].Attributes[´name´])), False); end; end; initialization CoInitialize(nil); PrepareXMLDoc; EnumModules(GetInfoModule, nil); CopyFiles(ExtractFilePath(Application.ExeName) + ´Runtime Packages´); SaveDependencyFile; finalization CoUninitialize; end.
Como dito anteriormente, basta adicionar esta unit no arquivo do projeto (.dpr) que, toda vez que vc executar seu programa, ela irá:
- Criar uma pasta chamada Runtime Packages dentro da pasta do seu projeto
- Copiar todos os pacotes que seu .exe precisa para funcionar para dentro desta pasta
- Criar um arquivo XML chamado DependencyList.xml, contendo o nome e a localização de cada pacote no seu PC.
Obs:
Lembre-se de remover a unit quando for compilar uma versão do seu programa que será implantada no cliente
Carlosfim
Mais Posts
29/04/2008
Mazzi
Bom ... que eu saiba nao existe um software que lhe diga quais dll´s vc deve usar para seu .EXE rodar, normalmente isso é um pré-requisito do proprio programador saber, porém esse conhecimento é fundamentado na leitura dos proprios componentes e recursos que o seu software utiliza.
Ex:
Se usa componentes DBX, vai usar:
-midas.dll;
-dbexpint.dll;
(não só dll´s) mas tbm:
-dbxconnections.ini;
-dbxdrivers.ini;
Se vai usar outro tipo de recurso, como por exemplo banco de dados Firebird, :
-fbClient.dll;
Se vai usar relatorios QReport:
-qtinf70.dll;
--qtinf71.dll;
---qtinf90.dll;
etc...
Outra coisa, normalmente o Delphi mesmo ao executar uma aplicação, informa o(s) arquivo(s) necessário(s) qdo preciso.
Espero ter ajudado.
Abraços++
21/02/2019
Tássio Gois
Quanto às dlls, eu não sei como verificar. Mas, com relação aos pacotes, o próprio delphi (2007) fornece essa informação através do menu Project -> Information for <nome do projeto>.
Esta unit que criei, baseada em um exemplo do livro Dominando o Delphi 7, do Cantú, copia todos os pacotes necessários para o seu .exe rodar para uma pasta dentro da pasta do projeto, todas as vezes que seu .exe é executado.
[code:1:100d532483]
unit UntExtractDependencies;
interface
implementation
uses
SysUtils, Windows, ActiveX, XMLDoc, XMLDom, XMLIntf, Classes, Forms, Variants, Dialogs;
var
DependencyDoc: TXMLDocument;
ModuleNode, ContNode, ReqNode: IXMLNode;
procedure GetInfoPackage(const Name: String; NameType: TNameType; Flags: Byte; Param: Pointer);
begin
case NameType of
ntContainsUnit: begin
ContNode := ContNode.AddChild(´Unit´);
ContNode.Attributes[´name´&93; := Name;
ContNode := ContNode.ParentNode;
end;
ntRequiresPackage: begin
ReqNode := ReqNode.AddChild(´Package´);
ReqNode.Attributes&91;´name´&93; := Name;
ReqNode := ReqNode.ParentNode;
end;
end;
end;
function GetInfoModule(HInstance: Longint; Data: Pointer): Boolean;
var
Flags: Integer;
ModulePath, ModuleName: string;
begin
//Extrai os dados do módulo
SetLength (ModuleName, 200);
GetModuleFileName (HInstance, PChar (ModuleName), Length (ModuleName));
ModulePath := PChar(ModuleName);
ModuleName := ExtractFileName(ModulePath);
//Cria o nó referente ao módulo atual e adiciona suas propriedades
ModuleNode := ModuleNode.AddChild(´Module´);
ModuleNode.Attributes&91;´name´&93; := ModuleName;
ModuleNode.Attributes&91;´location´&93; := ModulePath;
ModuleNode.Attributes[´description´&93; := GetPackageDescription(PChar(ModuleName));
if Flags and pfDesignOnly = pfDesignOnly then begin
ModuleNode.Attributes&91;´type´&93; := ´DesignTime´;
end;
if Flags and pfRunOnly = pfRunOnly then begin
ModuleNode.Attributes&91;´type´&93; := ´RumTime´;
end;
//Cria os nós Contains e Requires
ContNode := ModuleNode.AddChild(´Contains´);
ReqNode := ModuleNode.AddChild(´Requires´);
//Adiciona informações do pacote
GetPackageInfo(HInstance, nil, Flags, GetInfoPackage);
//Retorna ao módulo principal para a adição de um novo filho
ModuleNode := ModuleNode.ParentNode;
Result := True;
end;
procedure PrepareXMLDoc;
begin
//Prepara o documento XML
DependencyDoc := TXMLDocument.Create(Application);
DependencyDoc.DOMVendor := GetDOMVendor(´MSXML´);
DependencyDoc.Options := [doNodeAutoCreate,doAttrNull,doAutoPrefix,doNamespaceDecl&93;;
DependencyDoc.XML.Clear;
DependencyDoc.Active := True;
DependencyDoc.CreateElement(´xml´, ´´);
DependencyDoc.Version := ´1.0´;
DependencyDoc.Encoding := ´UTF-8´;
ModuleNode := DependencyDoc.AddChild(´ModulesList´);
end;
procedure SaveDependencyFile;
begin
DependencyDoc.SaveToFile(extractfilepath(Application.ExeName) + ´DependencyList.xml´);
DependencyDoc.Destroy;
end;
procedure CopyFiles(const Path: String);
var
cont: Integer;
begin
if Not(DirectoryExists(Path)) then begin
CreateDir(Path);
end;
for cont := 1 to ModuleNode.ChildNodes.Count - 1 do begin
CopyFile(PChar(Variants.VarToStr(ModuleNode.ChildNodes&91;cont&93;.Attributes&91;´location´&93;)), PChar(Variants.VarToStr(Path + ´\\´ + ModuleNode.ChildNodes&91;cont&93;.Attributes&91;´name´&93;)), False);
end;
end;
initialization
CoInitialize(nil);
PrepareXMLDoc;
EnumModules(GetInfoModule, nil);
CopyFiles(ExtractFilePath(Application.ExeName) + ´Runtime Packages´);
SaveDependencyFile;
finalization
CoUninitialize;
end.
[/code:1:100d532483]
Como dito anteriormente, basta adicionar esta unit no arquivo do projeto (.dpr) que, toda vez que vc executar seu programa, ela irá:
- Criar uma pasta chamada Runtime Packages dentro da pasta do seu projeto
- Copiar todos os pacotes que seu .exe precisa para funcionar para dentro desta pasta
- Criar um arquivo XML chamado DependencyList.xml, contendo o nome e a localização de cada pacote no seu PC.
Obs:
Lembre-se de remover a unit quando for compilar uma versão do seu programa que será implantada no cliente
Só deu erro na hora de compilar
[dcc32 Error] UntExtractDependencies.pas(70): E2250 There is no overloaded version of 'EnumModules' that can be called with these arguments
28/02/2019
Hélio Devmedia
Quanto às dlls, eu não sei como verificar. Mas, com relação aos pacotes, o próprio delphi (2007) fornece essa informação através do menu Project -> Information for <nome do projeto>.
Esta unit que criei, baseada em um exemplo do livro Dominando o Delphi 7, do Cantú, copia todos os pacotes necessários para o seu .exe rodar para uma pasta dentro da pasta do projeto, todas as vezes que seu .exe é executado.
[code:1:100d532483]
unit UntExtractDependencies;
interface
implementation
uses
SysUtils, Windows, ActiveX, XMLDoc, XMLDom, XMLIntf, Classes, Forms, Variants, Dialogs;
var
DependencyDoc: TXMLDocument;
ModuleNode, ContNode, ReqNode: IXMLNode;
procedure GetInfoPackage(const Name: String; NameType: TNameType; Flags: Byte; Param: Pointer);
begin
case NameType of
ntContainsUnit: begin
ContNode := ContNode.AddChild(´Unit´);
ContNode.Attributes[´name´&93; := Name;
ContNode := ContNode.ParentNode;
end;
ntRequiresPackage: begin
ReqNode := ReqNode.AddChild(´Package´);
ReqNode.Attributes&91;´name´&93; := Name;
ReqNode := ReqNode.ParentNode;
end;
end;
end;
function GetInfoModule(HInstance: Longint; Data: Pointer): Boolean;
var
Flags: Integer;
ModulePath, ModuleName: string;
begin
//Extrai os dados do módulo
SetLength (ModuleName, 200);
GetModuleFileName (HInstance, PChar (ModuleName), Length (ModuleName));
ModulePath := PChar(ModuleName);
ModuleName := ExtractFileName(ModulePath);
//Cria o nó referente ao módulo atual e adiciona suas propriedades
ModuleNode := ModuleNode.AddChild(´Module´);
ModuleNode.Attributes&91;´name´&93; := ModuleName;
ModuleNode.Attributes&91;´location´&93; := ModulePath;
ModuleNode.Attributes[´description´&93; := GetPackageDescription(PChar(ModuleName));
if Flags and pfDesignOnly = pfDesignOnly then begin
ModuleNode.Attributes&91;´type´&93; := ´DesignTime´;
end;
if Flags and pfRunOnly = pfRunOnly then begin
ModuleNode.Attributes&91;´type´&93; := ´RumTime´;
end;
//Cria os nós Contains e Requires
ContNode := ModuleNode.AddChild(´Contains´);
ReqNode := ModuleNode.AddChild(´Requires´);
//Adiciona informações do pacote
GetPackageInfo(HInstance, nil, Flags, GetInfoPackage);
//Retorna ao módulo principal para a adição de um novo filho
ModuleNode := ModuleNode.ParentNode;
Result := True;
end;
procedure PrepareXMLDoc;
begin
//Prepara o documento XML
DependencyDoc := TXMLDocument.Create(Application);
DependencyDoc.DOMVendor := GetDOMVendor(´MSXML´);
DependencyDoc.Options := [doNodeAutoCreate,doAttrNull,doAutoPrefix,doNamespaceDecl&93;;
DependencyDoc.XML.Clear;
DependencyDoc.Active := True;
DependencyDoc.CreateElement(´xml´, ´´);
DependencyDoc.Version := ´1.0´;
DependencyDoc.Encoding := ´UTF-8´;
ModuleNode := DependencyDoc.AddChild(´ModulesList´);
end;
procedure SaveDependencyFile;
begin
DependencyDoc.SaveToFile(extractfilepath(Application.ExeName) + ´DependencyList.xml´);
DependencyDoc.Destroy;
end;
procedure CopyFiles(const Path: String);
var
cont: Integer;
begin
if Not(DirectoryExists(Path)) then begin
CreateDir(Path);
end;
for cont := 1 to ModuleNode.ChildNodes.Count - 1 do begin
CopyFile(PChar(Variants.VarToStr(ModuleNode.ChildNodes&91;cont&93;.Attributes&91;´location´&93;)), PChar(Variants.VarToStr(Path + ´\\\\´ + ModuleNode.ChildNodes&91;cont&93;.Attributes&91;´name´&93;)), False);
end;
end;
initialization
CoInitialize(nil);
PrepareXMLDoc;
EnumModules(GetInfoModule, nil);
CopyFiles(ExtractFilePath(Application.ExeName) + ´Runtime Packages´);
SaveDependencyFile;
finalization
CoUninitialize;
end.
[/code:1:100d532483]
Como dito anteriormente, basta adicionar esta unit no arquivo do projeto (.dpr) que, toda vez que vc executar seu programa, ela irá:
- Criar uma pasta chamada Runtime Packages dentro da pasta do seu projeto
- Copiar todos os pacotes que seu .exe precisa para funcionar para dentro desta pasta
- Criar um arquivo XML chamado DependencyList.xml, contendo o nome e a localização de cada pacote no seu PC.
Obs:
Lembre-se de remover a unit quando for compilar uma versão do seu programa que será implantada no cliente
Só deu erro na hora de compilar
[dcc32 Error] UntExtractDependencies.pas(70): E2250 There is no overloaded version of 'EnumModules' that can be called with these arguments
Existe uma menu do delphi com uma opção que mostra as Dlls em uso:
View -> DebugWindow -> Modules
Espero ter ajudado...
Clique aqui para fazer login e interagir na Comunidade :)