ďťż

Ładny brzuch

Witam.
Napisałem funkcję do generowania GMT i włożyłem ją w dll'a.
Biblioteka wyglada tak:
library gmt; uses Windows, SysUtils, Controls, Forms, formu in 'formu.pas' {Form1}; {$R *.res} const Tydzien : array[1..7] of String = ( 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'); Miesiac : array[1..12] of String = ( 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'); function spr(podana_data:TDate; podana_godzina:TTime):string; var dzien,msc,rok:string; data:string; godz,min,sec:string; begin dzien:=Copy(DateToStr(podana_data),9,2); msc:=Copy(DateToStr(podana_data),6,2); rok:=Copy(DateToStr(podana_data),0,4); godz:=Copy(TimeToStr(podana_godzina),0,2); min:=Copy(TimeToStr(podana_godzina),3,2); sec:=Copy(TimeToStr(podana_godzina),6,2); data:=Tydzien[DayOfWeek(podana_data)]+', '+dzien+ //DZIĘN TYGODNIA I NUMER ' '+Miesiac[StrToInt(msc)]+ //MIESIĄC ' '+Rok+ //ROK ' '+TimeToStr(podana_godzina); Result:=data; end; function getGMT:string; var Form1 : TForm1; begin Form1 := TForm1.Create(Application); Form1.ShowModal; if not Form1.RadioButton1.Checked then Result:='ANULOWANO' else Result:=(spr(Form1.data.Date,Form1.czas.Time)); Form1.Free; //probowalem tez Close i destroy ;) end; exports getgmt name 'getgmt'; begin end.

I mam z tym problem.
Jeżeli jest postać taka jaka jest otrzymuję Access Violation.

Jeżeli nie ma funkcji, która pobiera GMT
(if not Form1.RadioButton1.Checked then Result:='ANULOWANO' else Result:=(spr(Form1.data.Date,Form1.czas.Time));)
Błędu nie ma. Ktoś umie coś poradzić?



1. Stwórz nowy dll
2. Przeczytaj co jest napisane w tym wielkim domyślnym komentarzu

co nieco z tego wywnioskowałem, tyle na ile mój ang. pozwala ;]
I mam ShareMem na pierwszy miejscu w Dll i exe, i zamiast String używam ShortString.
Ale błąd wciąż jest. ;]

//EDIT. Dzięki za pomoc, juz wiem. :D
Oprócz tego, nie dodałem jeszcze deklaracji stdcall; :)
Użytkownik DJ Mentos edytował ten post 24 wrzesień 2007, 20:29
Mam małą radę - tak a propos użycia shareMem - zamiast tego lepiej używać FastMM4 - nie musisz nic dołączać (dll), jest szybsze i informuje cię o wszelkich wyciekach pamięci ;)



dzieki za podpowiedz ;)
jak już jessteśmy w temacie dlli,
Ładuje je dynamicznie:
DLL := LoadLibrary('Biblioteki\gmt\gmt.dll'); try @gmt := GetProcAddress(DLL, 'getgmt'); if @gmt=nil then raise Exception.Create('Nie mogę znaleźć procedury w bibliotece. Upewnij się czy plik o.dll istnieje.'+#13+'Ponowne zainstalowanie aplikacji może naprawić ten problem.'); result:=gmt; finally FreeLibrary(DLL); end;
I czy jest możliwe aby zamiast wypisywać błąd, wyświetlić wiadomość, którą wysłał system?
tzn. tak jak robie w try except i exception.message ?

Nie pamiętam dokładne, ale czy przypadkiem try ... finally nie likwiduje komunikatu tylko zapewnia że to co w finally się wykona? Sprawdź na try exept.

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •