Q&A

  • dll 호출시 포인터는 어떻게 해야할까요?
이전에도 질문한 내용에 대한 보충 질문입니다.

C로 작성된 dll 내부 구조는 아래와 같습니다.
HRESULT WINAPI GetVersionInformation( P_VERSION_INFO VersionInfo );

typedef struct  _I_VERSION_INFO {
                                                          ULONG MajorVersion;
                                                          ULONG MinorVersion;
                                                          ULONG BuildNumber;
                                                       }  I_VERSION_INFO,  *P_VERSION_INFO;

여기에서 MajorVersion; MinorVersion; BuildNumber; 데이터를 가져와야 합니다.

아래는 dll을 델파이에서 호출해서 파라메터로 받는 것을 코딩한 것입니다.
아래 코드에서 포인터나 변수를 제대로 사용했는지 검증을 부탁드립니다.
실행시 에러는 없는데, 데이터를 맞게 가져오는것인지 모르겠습니다.
<!--CodeS-->
procedure TFormMain.ButtonMGRClick(Sender: TObject);
type
        T_VERSION_INFO  = record  MajorVersion  : Cardinal;
                                                     MinorVersion  : Cardinal;
                                                     BuildNumber   : Cardinal;
                                         end;
        P_VERSION_INFO = ^T_VERSION_INFO;

        TFunc = function ( VERSION_INFO : P_VERSION_INFO ) : HRESULT; cdecl;
var
        H                : THandle;
        MyFunc       : TFunc;
        dllFileName : String;
        VERSION_INFO : P_VERSION_INFO;
begin
        H  :=  LoadLibrary( PChar( 'idsc.dll' ) );

        if  H  <  32  then
                begin
                        ShowMessage( 'DLL function address not found!' );
                        Exit;
                end;

        GetMem( VERSION_INFO,  SizeOf( VERSION_INFO^ ) );
        try
                @MyFunc := GetProcAddress( H, 'GetVersionInformation' );

                if  @MyFunc = nil  then
                    begin
                        ShowMessage( 'DLL Address not found!' );
                        Exit;
                    end
                else
                    begin
                         Memo1.Lines.Clear;
                         Memo1.Lines.Add( IntToStr( MyFunc( VERSION_INFO ) ) );
                    end;
        finally
                FreeMem( VERSION_INFO );
                FreeLibrary( H );
        end;
end;
<!--CodeE-->
1  COMMENTS
  • Profile
    이정욱 2008.10.27 17:10
    GetVersionInformation 으로 위에 통합 검색 해보세요. 사용예가 잘 나와있습니다.