[delphi] komunikacja między bibliotekami a funkcje API

0

Witam

Napisałem aplikacje a do niej zestaw bibliotek. Jedna z nich jest odpowiedzialna za sprawdzanie dostępności aktualizacji (lib1), w tym celu pobiera z sieci odpowiednie informacje i przystępuje do porównywania ich z wersjami plików zainstalowanych na komputerze.

Inna biblioteka (lib2) zawiera najczęściej wywoływane funkcje i procedury, jedną z nich jest GetVersion która wygląda dokładnie tak:

function getVersion(strFileName:pchar) : pchar; stdcall;
var
  dwInfoSize, dwVerSize, dwWnd: DWORD;       
  FI: PVSFixedFileInfo; 
  ptrVerBuf: Pointer;  
  strVersion : string;  
begin
  dwInfoSize := getFileVersionInfoSize(strFileName, dwWnd);//  <----out
  begin 
    getMem( ptrVerBuf, dwInfoSize );
    try
      if getFileVersionInfo(strFileName, dwWnd, dwInfoSize, ptrVerBuf ) then
        if verQueryValue( ptrVerBuf, '\', pointer(FI), dwVerSize ) then
          strVersion :=
                      format( '%d.%d.%d.%d',
                       [ hiWord( FI.dwFileVersionMS ),
                         loWord( FI.dwFileVersionMS ),
                         hiWord( FI.dwFileVersionLS ),
                         loWord( FI.dwFileVersionLS ) ] );
    finally
      freeMem( ptrVerBuf );
    end;
  end;
  Result := pchar(strVersion);
end;

Powyższa funkcje jest wywoływana statycznie przez bibliotekę lib1 w celu pobrania wersje pliku exe lub dll.

Wszystko działa poprawnie do momentu kiedy jako parametr funkcji wysyłana jest ścieżka do biblioteki lib1. Czyli gdy biblioteka lib1 chce sprawdzić poprzez funkcje w bibliotece lib2 wersje samej siebie to w momencie wykonania oznaczonej na listingu wyżej linii kodu, następuje wyłączenie się aplikacji która nakazała sprawdzenie aktualizacji. Gdy uruchomię tę aplikacje poprzez delphi (z debugowaniem) to wyłapywany jest w tym momencie błąd AV.

Czy ktoś z forumowiczów ma pomysł jak to obejść bez wielkich przebudów?

Pozdrawiam

0

Przemysl, na adres jakiego obszaru pamieci wskazuje result i do ktorego momentu masz w nim zaalokowana pamiec.

0

Result czego? getFileVersionInfoSize? Sugerujesz że w tym jest prawdopodobnie problem, czy tylko przedstawiasz taką możliwość?

0

Wywołałem te funkcje dynamicznie i zaczęło śmigać. Ale jest jeden warunek to dynamiczne wywołanie musi być wykonane z wykorzystaniem lokalnych zmiennych. Ustawienie zmiennych:

var
  DLL : THandle;
  nazwa : function(cos:pchar); stdcall;

globalnie nadal będzie powodować AV w opisanym w pierwszym poście przypadku. Nie wiem dlaczego ale tak jest. Jak ktoś wie dlaczego to chętnie posłucham. :-)

0

Result zwraca wskaznik na tekst zawarty w strVersion. Problem polega na tym, ze strVersion jest zmienna lokalna, wiec z koncem funkcji jest dealokowane. Od tego momentu wskaznik, ktory zwracasz (a on przeciez nie zmienia swojej wartosci) wskazuje na obszar, ktory przez twoja aplikacje nie jest juz zaalokowany.

1 użytkowników online, w tym zalogowanych: 0, gości: 1