Autor Beitrag
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Sa 23.04.05 16:54 
Tag Leute.

Ich will für mein Programm eine Dll schreiben, was beim Updaten wohl recht praktisch ist, dann ich dann nur die dll oder die exe updaten muss, die jeweils ja kleiner sind, als wenn ich alle funktionen zusammen in der EXE lassen würde.

Mein Problem: ich wollte mich in der DLL Programmierung mit einem absolut einfachen Programm einarbeiten:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
library RMCfuncs;

{$R *.res}

function get(URL:String):String;
begin
Result:='was denn...?';
end;

exports get;

begin
end.

Die Hostanwendung sieht etwa so aus:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
unit Unit1;
{...}
function get(URL:String):String stdcallexternal 'RMCfuncs.dll';
{...}
procedure Button1Click(Sender: TObject);
begin
Edit1.Text:=get('asd');
end;


Wundert euch nicht, dass meine Funktion einen Parameter hat, den sie nicht verwendet, ich wollte vorher was anderes machen, und dachte, ich versuche das ganze mal so simpel wie möglich zu gestalten.

Gerade getestet: ganz ohne Parameter gibts ne zugriffsverletzung...

Habe ich (Idiot) irgentwie den Wald vor lauter Bäumen nicht gesehen, als ich Asserbads Tutorial überflogen habe? oder was mach ich denn nur falsch...? :'(

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Sa 23.04.05 17:19 
wenn du stdcall; benutzt musst du das auch in der dll benutzen!

_________________
wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
AXMD
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Sa 23.04.05 17:33 
Außerdem: keine Strings in DLLs wenn du borlndmm nicht einbindest!

AXMD
JayEff Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Sa 23.04.05 17:36 
Compiler hat folgendes geschrieben:
[Fataler Fehler] RMCfuncs.dpr(4): Datei nicht gefunden: 'borlndmm.dcu'

Vierte zeile: uses borlndmm;
Sicher, dass die so heist?

Compilieren tut er ja. aber bei aufruf der Funktion kommt deine Zugriffsverletzung. Meine funktion sieht nun so aus:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
function get:String stdcall;
begin
Result:='was denn...?';
end;

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
AXMD
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Sa 23.04.05 17:44 
user profile iconJayEff hat folgendes geschrieben:
Compiler hat folgendes geschrieben:
[Fataler Fehler] RMCfuncs.dpr(4): Datei nicht gefunden: 'borlndmm.dcu'

Vierte zeile: uses borlndmm;
Sicher, dass die so heist?

Eigentlich ja :gruebel:
user profile iconJayEff hat folgendes geschrieben:
Compilieren tut er ja. aber bei aufruf der Funktion kommt deine Zugriffsverletzung. Meine funktion sieht nun so aus:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
function get:String stdcall;
begin
Result:='was denn...?';
end;

Darf ich fragen, warum du das stdcall unbedingt brauchst? Da mit der AV liegt 100%ig an den Strings. Ersetz mal durch ShortString und du wirst sehen es geht. Für große Strings brauchst du allerdings den Borland Memory Manager (borlndmm)

AXMD
Muetze1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 346



BeitragVerfasst: Sa 23.04.05 18:28 
Moin!

Die BorlandMM.DLL ist der Borland Speichermanager (Heap) und der wird von der Unit ShareMem benutzt. Und wenn du eine neue DLL erstellst (Datei->Neu->Andere...->DLL), dann schreibt dir Delphi nicht umsonst oben in die DLL einen Kommentar rein wo er drauf hinweist: Wenn in der DLL Strings als Parameter übergeben oder als Rückgabewerte zurück gegeben werden, dann muss die Unit ShareMem in der DLL wie auch in deinem Projekt als aller erste Unit eingebunden werden.

MfG
Muetze1
AXMD
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Sa 23.04.05 18:32 
user profile iconMuetze1 hat folgendes geschrieben:
Moin!

Die BorlandMM.DLL ist der Borland Speichermanager (Heap) und der wird von der Unit ShareMem benutzt. Und wenn du eine neue DLL erstellst (Datei->Neu->Andere...->DLL), dann schreibt dir Delphi nicht umsonst oben in die DLL einen Kommentar rein wo er drauf hinweist: Wenn in der DLL Strings als Parameter übergeben oder als Rückgabewerte zurück gegeben werden, dann muss die Unit ShareMem in der DLL wie auch in deinem Projekt als aller erste Unit eingebunden werden.

MfG
Muetze1


Sorry :autsch: sharemem einbinden, weil das die borlndmm.dll einbindet - so wars ;)

AXMD
JayEff Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Sa 23.04.05 18:33 
he he he ook sorry ;) ich hab die dll nicht so erstellt, wollte erst was anderes machen, dann dachte ich.. "ach. machma mal ne dll..." und zack, einfach mal "program" mit "library" ersetzt... ok. mal schaun obs nun klappt *test* ok folgendes Problem: die Zeigeroperation (hab von zeigern kein plan, drum benutze ich sie (bewusst jedenfalls) nie. Mein Source:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
{...}
function get:String ; external 'RMCfuncs.dll'

{...}

procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text:=   get;
end;


die DLL:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
library RMCfuncs;

{$R *.res}
uses ShareMem;

function get:String;
begin
Result:='was denn...?';
end;

exports get;

end.


Er SCHREIBT in das Editfeld was er soll, zeigt aber trotzdem die Ungültige Zeigerop.

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
AXMD
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Sa 23.04.05 18:43 
Klar, weil du in dem Prog., das die DLL aufruft ebenfalls das "sharemem" brauchst. Und zwar immer als erste in der uses-Klausel! Tja, manchmal zahlt sich das Lesen dieser Kommentare auch aus ;)

AXMD
JayEff Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Sa 23.04.05 19:07 
oha sehr schön dann klappts ja jetzt. :D Ich hab noch ne 2. Frage die ich jetzt stellen werd (neuer Topic natürlich ^^)

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.