Autor Beitrag
Stoffel1984
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 219

Win NT, Win 2000
D6 Prof
BeitragVerfasst: Mi 01.09.04 09:01 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mi 01.09.04 09:29 
Hallo!

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

Cu,
Udontknow
Stoffel1984 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 219

Win NT, Win 2000
D6 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: 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.

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
Stoffel1984 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 219

Win NT, Win 2000
D6 Prof
BeitragVerfasst: Mi 01.09.04 14:56 
Ich habs befürchtet!
Mir wird nichts anderes übrigbleiben als PChars zu nehmen.

Trotzdem danke!
Neidhard von Reuental
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 268

XP
BDS 2006 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: 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.
  • Du bindest deine DLL zur Ladezeit (procedure xxx; external dllname;) und importierst den Speichermanager der DLL in die EXE (habe ich noch nie ausprobiert).
  • Du alloziierst eine feste Adresse im Speicher, in der du den Record für die Speichermanagerfunktionen der EXE-Datei hinschreibst, und von der du beim Laden der DLL diese ausliest und den Speichermanager der DLL durch diese Funktionen ersetzt.
  • Du setzt bei beiden (EXE und DLL) den Speichermanager auf den Speichermanager von C/C++ (malloc,free,realloc).


ausblenden volle Höhe 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.

_________________
Ist Zeit wirklich Geld?