이전에도 질문한 내용에 대한 보충 질문입니다.
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-->