Pomocy,funkcja dll !!!

0

Witam

Mam nadzieje ze uda mi sie czytelnie to przedstawic

mam w bibliotece dll taką procedurkę

Function ReadIniInteger(PlikIni: PCHar;Kategoria: PCHar;Element: PCHar;Domyslnie:Integer):Integer; stdcall;
var
Ini: TIniFile;
Sciezka:String;
begin
Sciezka:=ExtractFilePath(ParamStr(0))+ PlikIni;
Ini := TIniFile.Create(Sciezka);
with Ini do begin
Result := ReadInteger(Kategoria,Element,Domyslnie);
end;
Ini.Free;
end;

a potem wy<ort>kozystuje</ort> ją w programie

Begin
var
DLL : THandle;
ReadIniInteger : Function (PlikIni: PCHar;Kategoria: PCHar;Element: PCHar;Domyslnie:Integer):Integer;
begin
DLL := LoadLibrary('Proc.dll');
try
@ReadIniInteger := GetProcAddress(DLL, 'ReadIniInteger');
if @ReadIniInteger = nil then raise Exception.Create('Bład - nie mogę znaleźć proceudry w bibliotece!');
Form_Main.BmpTrackBar1.Position := ReadIniInteger(PChar('Bar.Ini'),PChar('Window'),PChar('TrackBarPos'),50);
finally
FreeLibrary(DLL);
end;

błąd Acces violation znika jezeli zmienie w procedurze z biblioteki SCIEZKA na nazwę pliku np. 'c:\Bar.ini'

kod ten wy<ort>kozystywany</ort> byl juz w procedurach z osobnego unitu i nie sprawial problemow.gdzie robie błąd?

0

Wydaje mi się ze to dlatego, że biblioteka nie zna bieżacego katalogu, wiec nie wie gdzie ten plik ma sie znajdować. Ale nie studiowałem tego kodu dokładnie wiec moge sie mylic :)

0

w kolejnym przypadku funkcja wywołuje się prawidłowo ale błędne okazuje sie przypisanie formie głównej wartości ustalonej przez procedurę biblioteki

procedure ReadMain; stdcall;
var
MailIni: TIniFile;
begin
MailIni := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'Bar.ini');
with MailIni do begin
Form_Main.BmpTrackBar1.Position := 10; <---------------
end;
MailIni.Free;
End;

ludzie pomóżcie

0

Blad w deklaracji powinna byc

ReadIniInteger : Function (PlikIni: PCHar;Kategoria: PCHar;Element: PCHar;Domyslnie:Integer):Integer;stdcall;

0

PlikIni: PCHar to jest tekst zakończone #0 a Sciezka:String czasami są problemy z automatyczną kowersją więc może

Sciezka:=ExtractFilePath(ParamStr(0)) + String(PlikIni);

0

Wydaje mi się, że w DLL'u po prostu nie zadziała prawidłowo ParamStr(0). Spróbuj przekazać całą ścieżkę w parametrze funkcji.

0

zaczyna trafiac mnie...

procedure ReadMain;
begin
Form_Main.BmpTrackBar1.Position := 10;
End;
exports
ReadMain;

/////////////////////////////////////
w programie uzywam jej nastepujac0 :

var
ReadMain : procedure;
HLib: THandle;
begin
try
if Hlib>0 then
Begin
HLib:=LoadLibrary('D:\Cd\Programy\Programowanie\Bar\Proc.dll');
@ReadMain:=GetProcAddress(HLib,'ReadMain');
if Assigned(ReadMain) then ReadMain;
End;
finally
FreeLibrary(HLib);
End;
end;

i wywala acces violation , czemu nie moge przypisac komponentowi na main form jakiejs wartosci.

0

A nie lepiej zamiast przypisywać z poziomu biblioteki DLL wartość komponentom formularza zadeklarować te procedury jako funkcje i wartości przypisywać w programie głównym? To może być przyczyną błędu. Poza tym, kiedyś możesz zmienić nazwy komponentów w formularzu głównym i zapomnieć o uaktualnieniu ich w bibliotece DLL.

0

A nie lepiej zamiast przypisywać z poziomu biblioteki DLL wartość komponentom formularza zadeklarować te procedury jako funkcje i wartości przypisywać w programie głównym? To może być przyczyną błędu. Poza tym, kiedyś możesz zmienić nazwy komponentów w formularzu głównym i zapomnieć o uaktualnieniu ich w bibliotece DLL.

tak też można zrobić,ale mnie chodzi o pozbycie się nadmiaru kodu z głównej aplikacji.już w tej chwili exe zajmuje prawie 1mb,a gdybym unit z procedurami zamienił na bibliotekę z której ppszczególne procedury ładowane będą wtedy gdy potrzeba to główna forma zmiejszyłaby się o prawie 1000linii kodu.z tego względu nie chce przypisywać wartości komponentom za pomocą funkcji dll i zwracania wartości w programie głównym bo to spowoduje tylko przeniesienie tego kodu z unitu z procedurami do programu głównego (oczywiście nie wszystkich bo np. procki obliczające itp byłyby zamieszczone w dll,ale np takie przypisywanie wartości - tego chyba nie da sie tak zrobic)

0

a czy Form_Main jest w DLL czy w programie głównym?

0

A nie lepiej zamiast przypisywać z poziomu biblioteki DLL wartość komponentom formularza zadeklarować te procedury jako funkcje i wartości przypisywać w programie głównym? To może być przyczyną błędu. Poza tym, kiedyś możesz zmienić nazwy komponentów w formularzu głównym i zapomnieć o uaktualnieniu ich w bibliotece DLL.

tak też można zrobić,ale mnie chodzi o pozbycie się nadmiaru kodu z głównej aplikacji.już w tej chwili exe zajmuje prawie 1mb,a gdybym unit z procedurami zamienił na bibliotekę z której ppszczególne procedury ładowane będą wtedy gdy potrzeba to główna forma zmiejszyłaby się o prawie 1000linii kodu.z tego względu nie chce przypisywać wartości komponentom za pomocą funkcji dll i zwracania wartości w programie głównym bo to spowoduje tylko przeniesienie tego kodu z unitu z procedurami do programu głównego (oczywiście nie wszystkich bo np. procki obliczające itp byłyby zamieszczone w dll,ale np takie przypisywanie wartości - tego chyba nie da sie tak zrobic)

Ale wiesz że sumarczycznie exe i DLL wyjdą i tak dużo więcej.

0

A nie lepiej zamiast przypisywać z poziomu biblioteki DLL wartość komponentom formularza zadeklarować te procedury jako funkcje i wartości przypisywać w programie głównym? To może być przyczyną błędu. Poza tym, kiedyś możesz zmienić nazwy komponentów w formularzu głównym i zapomnieć o uaktualnieniu ich w bibliotece DLL.

tak też można zrobić,ale mnie chodzi o pozbycie się nadmiaru kodu z głównej aplikacji.już w tej chwili exe zajmuje prawie 1mb,a gdybym unit z procedurami zamienił na bibliotekę z której ppszczególne procedury ładowane będą wtedy gdy potrzeba to główna forma zmiejszyłaby się o prawie 1000linii kodu.z tego względu nie chce przypisywać wartości komponentom za pomocą funkcji dll i zwracania wartości w programie głównym bo to spowoduje tylko przeniesienie tego kodu z unitu z procedurami do programu głównego (oczywiście nie wszystkich bo np. procki obliczające itp byłyby zamieszczone w dll,ale np takie przypisywanie wartości - tego chyba nie da sie tak zrobic)

Ale wiesz że sumarczycznie exe i DLL wyjdą i tak dużo więcej.

Form_Main jest w dll-ce.Chodzi Ci o to,że zajmują więcej miejsca?To się zgodze,ale mój program działa w tle non-stop i dlatego ważne jest by zajmował jak najmniej miejsca i jak najmniej czasu procesora.To że będzie więcej na dysku jest nie ważne.A przecież dll-ka będzie ładowana dynamicznie tylko pare razy a potem zwalniana więc nie będzie zajmować niepotrzebnie pamięci.

0

No i do tego dochodzi jeszcze jedna zaleta dzielenia na exe'ka i DLL'e. Aktualizacja. Jeśli program jest udostępniony w sieci, to zmiana jednej linijki kodu nie wymaga ściągania całego programu, tylko poszczególnej biblioteki, w której nastąpiła zmiana.

0

racja , ale chyba nikt nie wymyśli już nic w tym temacie.będe musiał przenieść do dll te procedurki których implementacja mi się uda,zawsze to coś

dzięki wszystkim za pomoc

0

Moim zdaniem odpowiedź padła - patrz post reichela (niedopasowanie konwencji wywołania).

0

Też tak myśle. Tylko koleś używaj znaczników DELPHI!!!

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