Q&A

  • dll의 펑션, 함수 리스트 구하기에 대해..
안녕하세염.. 언제나 초보를 외치구 있는 나두초보!! 입니다.

아래의 함수는 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;
0  COMMENTS