안녕하세염.. 언제나 초보를 외치구 있는 나두초보!! 입니다.
아래의 함수는 dll의 펑션 및 함수 리스트를 구하는 함수입니다.
(출처 : 구창민님 홈피)
문제는 포인터로 잡은 arr의 pointer가 nil 값으로
반환되어(arr := ImageDebugInformation^.ExportedNames;
)
함수의 리스트를 구하지 못하구 있습니다.
물론 에러는 없구염.. ㅡ,.ㅡ;
여러차례 디버깅 해보았지만.. 답이 나오질 않고 있네염...ㅠ,.ㅠ;
혹시 아시는 분이 있다면... 설명 좀 부탁드립니다.
구럼 즐푸~~~
procedure ListDLLFunctions(DLLName: string; List: TStrings);
// by Dmitry Streblechenko
type
chararr = array[0..$FFFFFF] of char;
var
h: THandle;
i, fc: integer;
st: string;
arr: pointer;
ImageDebugInformation: PImageDebugInformation;
begin
List.Clear;
DLLName := ExpandFileName(DLLName);
if FileExists(DLLName) then
begin
h := CreateFile(PChar(DLLName),
GENERIC_READ,
FILE_SHARE_READ or FILE_SHARE_WRITE,
nil,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);
// list.add('dll 있음');
if h <> INVALID_HANDLE_VALUE then
try
ImageDebugInformation := MapDebugInformation(h, PChar(DLLName), nil, 0);
if ImageDebugInformation <> nil then
try
arr := ImageDebugInformation^.ExportedNames;
//if arr = nil then showmessage('-0-');
fc := 0;
for i := 0 to ImageDebugInformation^.ExportedNamesSize-1 do
if chararr(arr^)[i] = #0 then
begin
st := PChar(@chararr(arr^)[fc]);
if length(st)>0 then List.Add(st);
if (i>0) and (chararr(arr^)[i-1]=#0) then Break;
fc := i+1;
end;
finally
UnmapDebugInformation(ImageDebugInformation);
end;
finally
CloseHandle(h);
end;
end;
end;