Problemas com string...
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???
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
Curtidas 0
Respostas
Marcelo Saviski
20/12/2004
vc pode trocar
por
esperimente ver o que esta vindo de resultado do OpenDialog, depois do
experimente dar um
para verificar se o nome do arquivo está certo
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
GOSTEI 0
Dopi
20/12/2004
Reparei que nao existe uma chamada ao Metodo EXECUTE do OpenDialog
if OpenDialog1.Execute then begin s := OpenDialo1.Filename ; ... ... end ;
GOSTEI 0
Ertai
20/12/2004
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.
É 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.
GOSTEI 0
Massuda
20/12/2004
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:Depois de feita essa alteração, aparentemente funciona sem problemas, independente de como se atribui o valor de s... qual erro está ocorrendo?
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;
GOSTEI 0
Ertai
20/12/2004
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...
Mas com essa sua mudança ai, agora funciona legal.
Valeu cara...
GOSTEI 0