Descobrir arquivos utilizados pelo exe

Delphi

29/04/2008

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

Curtidas 0

Melhor post

Carlosfim

Carlosfim

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


GOSTEI 1

Mais Respostas

Mazzi

Mazzi

29/04/2008

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


GOSTEI 0
Tássio Gois

Tássio Gois

29/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




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
GOSTEI 0
Hélio Devmedia

Hélio Devmedia

29/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




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...
GOSTEI 0
POSTAR