Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Record aus DLL zurückgeben


Stoffel1984 - Mi 01.09.04 09:01
Titel: Record aus DLL zurückgeben
Hallo,

ich habe ein Form, welches in einer DLL "verpackt" ist.
In diesem Form fülle ich einen Record.
Die Aufruf Funktion der DLL zum anzeigen des Fensters soll schließlich den Record als Result zurückgeben.
Leider bekomme ich da immer eine Access Violation.
Weiß jemand an was das liegen könnte?
Bzw. habe ich was übersehen - Probleme bei Speicherbereichen o.ä.?

Danke schonmal,

Stoffel


Udontknow - Mi 01.09.04 09:29

Hallo!

Probiere es mal mit Suche in: Delphi-Forum, Delphi-Library SHAREMEM.

Cu,
Udontknow


Stoffel1984 - Mi 01.09.04 11:12

Hallo,

ich hab jetzt etwas mit ShareMem rumgespielt.
Allerdings möchte ich die Borland DLL nicht mitgeben.
Gibts da keine andere Möglichkeit?
Mit Pointern oder so?

Grüße, Stoffel


Motzi - Mi 01.09.04 11:55

Doch.. so wie in dem automatisch eingefügten Kommentar in der Dll steht:
Zitat:
To avoid using BORLNDMM.DLL, pass string information using PChar or ShortString parameters.


Stoffel1984 - Mi 01.09.04 14:56

Ich habs befürchtet!
Mir wird nichts anderes übrigbleiben als PChars zu nehmen.

Trotzdem danke!


Neidhard von Reuental - Mi 01.09.04 19:04

ich benötige auch gerade etwas in der art. ich lad in meiner dll zum beispiel eine stringliste in den speicher und will der anwendung einen zeiger darauf übergeben.
wie könnt ich das aber nun realisieren?
und das ganze ohne sharemem.
hab mir schon mal überlegt den zeiger in ein longword umzuwandeln und in der anwendung zurück in einen zeiger. geht das überhaupt? :roll:


AndyB - Mi 01.09.04 23:47

Neidhard von Reuental hat folgendes geschrieben:
hab mir schon mal überlegt den zeiger in ein longword umzuwandeln und in der anwendung zurück in einen zeiger. geht das überhaupt? :roll:

Natürlich kannst du einen Zeiger in ein LongWord typecasten (zumindest auf 32-Bit Systemen). Aber bringen wird dir das auch nichts. Ob du die Adresse nun von der einen oder der anderen Seite betrachtest, ändert nichts an der Tatsache, dass es eine Adresse ist, die du vom Speichermanager bekommen hast. Und wenn du zwei Speichermanager am laufen hast (EXE und DLL), dann geht das beim Freigeben des Speichers trotzdem nach hinten los.

Es gibt aber mehrere Möglichkeiten, wie du das Problem umgehen kannst.



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
unit CMemMan;

interface

procedure free(p: Pointer); cdecl;
function malloc(Size: Integer): Pointer; cdecl;
function realloc(p: Pointer; Size: Integer): Pointer; cdecl;

implementation

const
  msvcrt = 'msvcrt.dll';

procedure free(p: Pointer); cdeclexternal msvcrt;
function malloc(Size: Integer): Pointer; cdeclexternal msvcrt;
function realloc(p: Pointer; Size: Integer): Pointer; cdeclexternal msvcrt;

function CGetMem(Size: Integer): Pointer;
begin
  Result := malloc(Size);
end;

function CFreeMem(p: Pointer): Integer;
begin
  free(p);
  Result := 0;
end;

function CReallocMem(p: Pointer; Size: Integer): Pointer;
begin
  Result := realloc(p, Size);
end;

const
  CMemoryManager: TMemoryManager = (
    GetMem: CGetMem;
    FreeMem: CFreeMem;
    ReallocMem: CReallocMem;
  );

initialization
  SetMemoryManager(CMemoryManager);

finalization

end.

Diese Unit musst du nur als aller erste Unit in der DLL und der EXE Datei einbinden (in der .dpr-Datei). Danach bist du von allen Speichermanager-Problemen bezüglich DLLs befreit.