Descobrir arquivos utilizados pelo exe

29/04/2008

0

Bom dia colegas,

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

Tappedroso

Responder

Post mais votado

30/04/2008

Mazzi,

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

Carlosfim
Responder

Mais Posts

29/04/2008

Mazzi

Ola, tudo bem?

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++


Responder

21/02/2019

Tássio Gois

Mazzi,

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
Responder

28/02/2019

Hélio Devmedia

Mazzi,

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...
Responder

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar