ďťż

Ładny brzuch

Więc mam sobie dll'kę, a w niej funkcję, którą eksportuję do aplikacji. Coś na wzór:function abc: PCHar; stdcall; var tmp: String; begin tmp:= 'łubudubu'; GetMem(Result, Length(tmp)+1); StrPCOpy(Result, tmp); end; W aplikacji function abc: PCHar; stdcall; external 'mojdll.dll'; //... Edit.Text:= abc;
Wszystko działa pięknie tylko, że jest jeden problem: wyciek pamięci (zapewne przez to GetMem). No więc próbowałem robić w aplikacji np. var p: PChar; begin p:= abc; Edit.Text:=p; Dispose(p); ale dostaje błąd: "'Invalid pointer operation". Próbowałem, też zwalniać p przez FreeMem, ale z tym samym skutkiem. Próbowałem także wysyłać wynik jako parametr:function abc(var o: PCHar): PCHar; stdcall; var tmp: String; begin tmp:= 'łubudubu'; GetMem(o, Length(tmp)+1); StrPCOpy(o, tmp); end; Ale i takiego cosia potem też nie idzie zwolnić przez Dispose lub FreeMem.

I tu moje pytanie jak sobie z takim czymś poradzić. Najlepiej bez żadnego ShareMem itp. Musi się to dać jakoś zrobić, ale nie mam już pomysłu jak.

Aha. Wycieki pamięci badam przy pomocy FastMM (jakby to kogoś interesowało)
Dzięki :)



Mysle ze tekstu nie powinno sie tak przesylac. Lepiej jak wyslesz wskaznik na ja wiem... rekord do programu. Ja zrobilem sobie interfejs do wtyczek, w ktorym mam tylko jedna funkcje eksportowa, przez nia przesylam sobie rekord w ktorym mam adresy do funkcji z biblioteki /i z programu, zalezy z ktorej strony patrzec/ i nie zauwazylem aby to sie sypalo.
Cos na ksztalt:
type //deklaracja rekordu PInputPlugin = ^TInputPlugin; TInputPlugin = record //zmienne, funkcje, procedury end;
A w programie
var info : PInputPlugin; //a w kodzie new(info); info^.hwndMain := Form1.Handle;//itd. przypisuje zmienne info^.UpdateAssocs := UpdateAssocs;//oraz funkcje, ta jest zadeklarowana wyzej od tego kodu w ten sposob: function UpdateAssocs : integer; stdcall;
I nie uzywam teraz dispose(info), bo by mi informacje o wtyczce wywalil /zwolnil pamiec rekordu/ i nici. Zwalniam wszystko dopiero przy zamykaniu programu.
W ten sam sposob co wyzej przypisuje zmienne/fukcje w bibliotece
function PlgInit(var PInputPlg : PInputPlugin) : integer; stdcall; begin PInputPlg^.Extensions := 'AVI;MPG;MPEG;WMV;3GP;ASF'; end;
A wywoluje je normalnie przez info.funkcja; czy info.zmienna := x;. Nie wiem czy to jest w 100% dobrze /nie znam sie super na wskaznikach/, ale dziala i xp o nic sie nie pluje.
Mysle ze mnie rozumiesz. :)

Mhm, mogę i spróbować z całymi rekordami, tylko kurcze trochę głupio to będzie wyglądać - żeby używać aż rekordu dla jednego głupiego PChara :>


Mhm, mogę i spróbować z całymi rekordami, tylko kurcze trochę głupio to będzie wyglądać - żeby używać aż rekordu dla jednego głupiego PChara :> Nie no, fakt. Ja to przesylalem troche wieksze paczki.

Nie wiem, moze to glupie bedzie co napisze /nie mam praktyki z PChar'ami/, ale mam taka madra ksiazeczke o delphim i przejzalem ja, moze by tak zamiastStrPCOpy(Result, tmp); //dac Result := StrPCopy(Result, tmp);??



Nie, nie, takie coś nic nie daje :) Ogólnie StrPCopy zwraca wskaźnik na ten element, który podajesz jako pierwszy paramert :]

Ha! Udało się naprawić :> Dla potomności (może ktoś będzie miał podobny problem kiedyś) opiszę całe rozwiązanie :)

Po przeczytaniu artykułu stąd dowiedziałem się jak trzeba zrobić aby działo :)
Wystarczyło w DLL'ce zrobić dodatkową funkcję procedure FreeChar(P: PCHar); begin FreeMem(p, Length(p)+1); end;
W programie zaś wystarczyło już tylko:function abc: PCHar; stdcall; external 'mojdll.dll'; procedure FreeChar(P: PCHar); stdcall; external 'mojdll.dll'; //..... var p: PChar; begin p:= abc; FreeChar(p);

I już mogę cieszyć się aplikacją bez błędów i DLL'ką bez wycieków pamięci :)

//Wielkie sorki za post pod postem :)
Użytkownik -=PcSA=- edytował ten post 07 styczeń 2007, 22:12

Nie, nie, takie coś nic nie daje :) Ogólnie StrPCopy zwraca wskaźnik na ten element, który podajesz jako pierwszy paramert :] Wiem co StrPCopy zwraca, w tej mojej madrej ksiazeczce bylo napisane. :)
Wiec tez myslalem ze tak trzeba, a tu zonk. ;)
A nie mozna tego FreeMem wywolac w programie?

Nie bo jest błąd "Invalid pointer operation" :D Pewnie jakieś mechanizmy zabezpieczania danych w RAM'ie żeby nieswoje procesy nie grzebały innym :>
Użytkownik -=PcSA=- edytował ten post 07 styczeń 2007, 22:40

Nie bo jest błąd "Invalid pointer operation" :D Pewnie jakieś mechanizmy zabezpieczania danych w RAM'ie żeby nieswoje procesy nie grzebały innym :> Moze, ale pamietem ze Deluxe Ski Jump /jakas konkretna wersja/ mial taki fajny 'dodatek', ktorym mozna bylo zmieniac kierunek i sile wiatru. :D  Najpierw program sprawdzal czy dsj jest uruchomione, potrem wyszukiwal w pamieci te gre i zmienial odpowiednie dane. Jakos windows specjalnie sie nie czepial /co prawda na xp nie probowalem/.


/co prawda na xp nie probowalem/.
Dokładnie, bo to-to działa tylko na Win98 :) Zatem czy można rzec, że WinXP utrudnia nam, programistom, pracę? :D


Dokładnie, bo to-to działa tylko na Win98 :) Zatem czy można rzec, że WinXP utrudnia nam, programistom, pracę? :D A 95 czy ME? Jedna linia w koncu. :P
Alez oczywiscie. Wywala niepotrzebne nikomu bledy, a nasze programy sa przeca bezbledne i dzialaja super idealnie. ;)

No dobra, ale tak dla zastanowienia: jak działają te dzisiejsze trainery do gier? W końcu nie wszystkie symulują przyciśnięcie klawiszy w takiej kolejności, żeby powstał kod, który daje nam (graczowi) np. tyle a tyle kasy...
Zatem te trainery muszą jakoś modyfikować odpowiednie wartości komórek w pamięci, należących do innego programu (gry)... Tylko jak?

_______
Przykład gry i trainera: GTA: SA, trainera nazwy nie pamiętam :)

PS. nigdy nie korzystałem z Win95 i ME :)
Użytkownik pbnan edytował ten post 08 styczeń 2007, 19:43
Eee, bo modyfikacja a zwalnianie to nie to samo. Szczerze sam się super nie orientuję w tej dziedzinie, więc może moje spostrzeżenie, że to wina ochrony pamięci, może być całkowicie błędne :>


Eee, bo modyfikacja a zwalnianie to nie to samo. Szczerze sam się super nie orientuję w tej dziedzinie, więc może moje spostrzeżenie, że to wina ochrony pamięci, może być całkowicie błędne :> Alez oczywiscie. Jakbys zwolnil pamiec jakiegos procesu to moglbys niezlej kaszanki narobic, a zmieniajac pamiec niekoniecznie musisz mu zaszkodzic. Na pewno idzie grzebac w pamieci, trzeba tylko wiedziec jak. W koncu wirusy, rootkity i spolka jakos sobie w systemie zyja. ;)

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