GARANTIR DESCONTO

Fórum Problemas com string... #262776

20/12/2004

0

Tenho a seguinte função para listar o nome de rotinas de um DLL

procedure ListDLLExports(const FileName: string; List: TStrings);
type
TDWordArray = array [0..$FFFFF] of DWORD;
var
imageinfo: LoadedImage;
pExportDirectory: PImageExportDirectory;
dirsize: Cardinal;
pDummy: PImageSectionHeader;
i: Cardinal;
pNameRVAs: ^TDWordArray;
Name: string;
begin
List.Clear;
if MapAndLoad(PChar(FileName), nil, @imageinfo, True, True) then
begin
try
pExportDirectory := ImageDirectoryEntryToData(imageinfo.MappedAddress,
False, IMAGE_DIRECTORY_ENTRY_EXPORT, dirsize);
if (pExportDirectory <> nil) then
begin
pNameRVAs := ImageRvaToVa(imageinfo.FileHeader, imageinfo.MappedAddress,
DWORD(pExportDirectory^.AddressOfNames), pDummy);
for i := 0 to pExportDirectory^.NumberOfNames - 1 do
begin
Name := PChar(ImageRvaToVa(imageinfo.FileHeader, imageinfo.MappedAddress,
pNameRVAs^[i], pDummy));
List.Add(Name);
end;
end;
finally
UnMapAndLoad(@imageinfo);
end;
end;
end;


Quando chamo ela assim ela funciona e lista as rotinas:
s:= ´C:\WINDOWS\SYSTEM32\browseui.dll´;
ListDLLExports(s, List);
s1:=´´;
for i:=0 to list.count-1 do
s1:= s1 + list[i] + #1013;

mas se seleciono o arquivo com um Dialog, não funciona:
s:= Opendialog1.filename;
ListDLLExports(s, List);
s1:=´´;
for i:=0 to list.count-1 do
s1:= s1 + list[i] + 1013;

Alguém sabe o porque disso???


Ertai

Ertai

Responder

Posts

20/12/2004

Marcelo Saviski

vc pode trocar

s1:=´´; 
for i:=0 to list.count-1 do 
s1:= s1 + list[i] + 1013; 


por

s1 := list.Text;



esperimente ver o que esta vindo de resultado do OpenDialog, depois do
s:= Opendialog1.filename; 

experimente dar um
ShowMessage(s);

para verificar se o nome do arquivo está certo


Responder

Gostei + 0

20/12/2004

Dopi

Reparei que nao existe uma chamada ao Metodo EXECUTE do OpenDialog

if OpenDialog1.Execute then
begin
   s := OpenDialo1.Filename ;
...
...
end ;



Responder

Gostei + 0

20/12/2004

Ertai

eu só coloquei um resumo da forma como estou usando a rotina.
É claro que eu estou usando o execute, e o valor do filename está correto.

O problema é que dependendo de como a variavel s foi preenchida, o resultado da variavel list da errado.


Responder

Gostei + 0

20/12/2004

Massuda

Tentei testar seu código usando D5+Win XP Pro e tive que fazer uma pequena alteração em ListDLLExports devido a um AV que ocorria ao tentar obter o nome da função exportada pela DLL:
procedure ListDLLExports(const FileName: string; List: TStrings);
type
    TDWordArray = array[0..$FFFFF] of DWord;
var
    imageinfo: LoadedImage;
    pExportDirectory: PImageExportDirectory;
    dirsize: Cardinal;
    pDummy: PImageSectionHeader;
    I: Cardinal;
    pNameRVAs: ^TDWordArray;
    Name: string;
    pName: PChar; // <-- NOVO
begin
    List.Clear;
    if MapAndLoad(PChar(FileName), nil, @imageinfo, True, True) then begin
        try
            pExportDirectory := ImageDirectoryEntryToData(imageinfo.MappedAddress,
                False, IMAGE_DIRECTORY_ENTRY_EXPORT, dirsize);
            if (pExportDirectory <> nil) then begin
                pNameRVAs := ImageRvaToVa(imageinfo.FileHeader, imageinfo.MappedAddress,
                    DWord(pExportDirectory^.AddressOfNames), pDummy);
                for I := 0 to pExportDirectory^.NumberOfNames - 1 do begin
                    pName := PChar(ImageRvaToVa(imageinfo.FileHeader, imageinfo.MappedAddress,
                        pNameRVAs^[I], pDummy));
                    if Assigned(pName) then begin
                        Name := PChar(pName);
                        List.Add(Name);
                    end;
                end;
            end;
        finally
            UnMapAndLoad(@imageinfo);
        end;
    end;
end;
Depois de feita essa alteração, aparentemente funciona sem problemas, independente de como se atribui o valor de s... qual erro está ocorrendo?


Responder

Gostei + 0

21/12/2004

Ertai

O Erro era qua a variavel list vinha com lixo, e não com o nome das rotinas.
Mas com essa sua mudança ai, agora funciona legal.
Valeu cara...


Responder

Gostei + 0

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

Aceitar