Autor Beitrag
bieberpelz
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26



BeitragVerfasst: Mo 12.09.05 12:25 
Problem: Ich möchte in Delphi eine .dll erstellen und diese in einem anderen Projekt oder ggf einer anderen Entwicklungsumgebung nutzen. Es erscheint beim öffnen eine Fehlermeldung.

Folgendes habe ich gemacht um eine .dll zu erstellen. Als erstes habe ich die Entwicklungsumgebung geöffnet. Unter Datei--> Neu habe ich dann DLL ausgewählt und folgenden code erstellt.
//Code habe ich nicht alles angegeben, nur das wichtigste.
ausblenden 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:
library RORAMdll;

uses
  SysUtils,
  Classes,
  Windows;

{$R *.RES}
function ReadRAM2(RAMAdress : Integer; Such : String) : Integer;

var
  [code]
  value : integer;
  begin
       [code]
       .....
       [code]
            result := value;
            
         end
end;

Exports
ReadRAM2;

begin
end.

Folgend habe ich dann die .dll erstellen lassen
In einem weiteren Projekt habe ich diese .dll in dem selbigen ProjektOrdner geschoben.
In diesem Projekt habe ich dann folgenden Code genutzt um diese Function aufrufen zu können.

ausblenden Delphi-Quelltext
1:
function ReadRAM2(RAMAdress : Integer; Such : String) : Integer; external 'RORAMdll.dll';					


Leider ergibt sich hier folgende Fehlermeldung an der stelle "external"
Zitat:
Felddefinition nicht erlaubt nach Methoden oder Eigenschaften


Es wäre nett wenn mich jemand da aufklären könnte oder mir jemand nen Tipp geben könnt da ich auf dem Gebiet der .dll gerade angefangen bin und diese gerne nutzen/erstellen möchte.

Anmerkung: In diesem Forum habe ich die letzten Threads zum Thema .dll anhand der Suchfunktion abgeklappert und google genutzt nur leider nichts gefunden, entschuldigt fals mein Problem hier erklärt wird und ich es nicht finde.
Über genaue Beschreibungen der Tatsachen wäre ich sehr dankbar weil oft kriegt man Lösungen weiß aber nicht genau warum es die Lösung ist ;)


Vielen danke im vorraus
Mfg Bieberpelz;)
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 12.09.05 12:51 
Dein erstes Problem ist der String, den du übergibst:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
library Project2;

{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }


uses
  SysUtils,
  Classes;

{$R *.res}

begin
end.


Aus der Delphi Hilfe:
ausblenden Delphi-Quelltext
1:
function SomeFunction(S: string): string; external 'strlib.dll';					

Sollte also eigentlich stimmen. :gruebel:
bieberpelz Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26



BeitragVerfasst: Mo 12.09.05 13:00 
Hmm OK das es am String liegt ist dann schonmal gut zu wissen, nur ganz weiß ich nun nicht was ich da machen soll bzw wobei mir der von dir gegebene Code hilft.
Wäre nett wenn du es mir eventuell weiter erklären könntest.
danke

Edit: Ich habe es mal OHNE den String ausprobiert und einfach nur mit übergabe wert eines Integers gemacht, das selbe dann auch beim aufruf aber es erscheit die selbe Fehlermeldung.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 12.09.05 13:13 
Steht doch im Kommentar von dem Delphicode, wen man eine DLL erstellt: Entweder mit PChars arbeiten oder doe Sharemem.dll von Borland benutzen und dann natürlich mit ausliefern. Aber das müsste eigentlich in jdem zweiten Posting hier im Forum stehen, in dem es um DLLs und Strings geht. :roll:

Den zweiten Fehler kann ich mir auch nicht erklären.
Sprint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 849



BeitragVerfasst: Mo 12.09.05 13:24 
user profile iconbieberpelz hat folgendes geschrieben:
Leider ergibt sich hier folgende Fehlermeldung an der stelle "external"
Zitat:
Felddefinition nicht erlaubt nach Methoden oder Eigenschaften

Ein Beispiel wie so eine Fehlermeldung zu stande kommt:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
type
  TForm1 = class(TForm)
  private
    { Private-Deklarationen }
    procedure MyProcedure;
    FMyValue: String;
  public
    { Public-Deklarationen }
  end;

Richtig wäre:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
type
  TForm1 = class(TForm)
  private
    { Private-Deklarationen }
    FMyValue: String;
    procedure MyProcedure;
  public
    { Public-Deklarationen }
  end;

_________________
Ciao, Sprint.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 12.09.05 13:25 
Das wird aber aus der geposteten ZeileCode nicht ersichtlich. ;)
bieberpelz Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26



BeitragVerfasst: Mo 12.09.05 13:39 
Ja das ist soweit nun verständlich, würde ich mich im Nachhinein auch drum kümmern aber momentan habe ich es mit der selbigen Funktion gemacht die nur einen Integer Wert verlangt und auch nur einen Integer wert ausgibt. Somit keine Strings.
Ich habe mal die "DLLExportsFunc", welche ich hier im FAQ-Forum fand, genutzt und der findet auch die angegeben Function und zeigt diese an.
Soweit kann es nicht falsch sein.
Dann kann es meiner Meinung nach nur beim Aufrufen falsch sein und beim Aufrufen setzt er den Zeiger direkt an den Ausdruck "external" und gibt die unten genannte Fehlermeldung aus.
Die .dll habe ich nach jedem neu erstellen auch wieder in den Ordner des anderen Projektes kopiert damit die aktuelle vorhanden ist.

Ich gebe einfach mal den ganzen Code bekannt fals dort der Fehler sein könnte.

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:
library RORAMdll;

uses
  SysUtils,
  Classes,
  Windows;

{$R *.RES}
function ReadRAM2(RAMAdress : Integer) : Integer;

var
  HRo, HProcess : HWND;
  value               : Integer;
  pid,written        : Cardinal;

  begin
       HRo := FindWindow(nil,'Ragnarok');
         if HRo = 0 then begin
            result := 123456;
         end
         else begin
            GetWindowThreadProcessId(HRo,@pid);
            HProcess := OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid);
            ReadProcessMemory(HProcess,ptr(RAMAdress),@value,4,written);
            result := value;
            CloseHandle(HProcess);
         end
end;

Exports
ReadRAM2;

begin
end.


Oben beim declarieren gebe ich das ganze dann so an.

ausblenden Delphi-Quelltext
1:
function ReadRAM2(RAMAdress : Integer) : Integer; external 'RORAMdll.dll';					


Wie man sieht kann es doch nichtmehr am String liegen oder liege ich da falsch?

Tut mir leid wenn ich da irgendwas nicht ganz verstehe, bin halt auf diesem Gebiet anfänger(würde sonst auch nicht fragen ;) )
Danke

//Edit: Ich bemerke gerade beim schreiben den Post von Sprint. Ich wüsste nun nicht was dieses an meinem Problem ändern könnte da nichts derart vorhanden ist um solch einen Fehler auf der Weise zu verursachen. Selbst wenn ich selbiges mit einem leeren Projekt mache und als einzigste Deklaration diese Function geklariere kommt selbiger Fehler, schliesslich benötige ich keine anderen variablen oder Functionen bis zu dem Zeitpunkt.
Oder liege ich da irgendwo total verkehrt?
Habe alles ausprobiert.

Danke
Sprint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 849



BeitragVerfasst: Mo 12.09.05 13:57 
user profile iconbieberpelz hat folgendes geschrieben:
Ich bemerke gerade beim schreiben den Post von Sprint. Ich wüsste nun nicht was dieses an meinem Problem ändern könnte da nichts derart vorhanden ist um solch einen Fehler auf der Weise zu verursachen. Selbst wenn ich selbiges mit einem leeren Projekt mache und als einzigste Deklaration diese Function geklariere kommt selbiger Fehler, schliesslich benötige ich keine anderen variablen oder Functionen bis zu dem Zeitpunkt.
Oder liege ich da irgendwo total verkehrt?

Dieses Forum bietet dir den Service "Anhang". Der Fehler liegt bei dir. Und du wirst ihn nicht in deiner DLL finden.

_________________
Ciao, Sprint.
bieberpelz Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26



BeitragVerfasst: Mo 12.09.05 14:08 
Das der Fehler bei mir liegt ist mir schon klar nur wo ich diesen gemacht habe kann ich leider nicht finden. Sorry

Ich habe aber mal den "Anhang" genutzt und die den Code für das erstellen der .dll geschickt sowie den Code zum Aufruf dieser.
Wäre dankbar wenn ich da geholfen werden könnte.
Einloggen, um Attachments anzusehen!
Sprint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 849



BeitragVerfasst: Mo 12.09.05 14:58 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
type
  TForm1 = class(TForm)
  private
    { Private-Deklarationen }
  public
  function ReadRAM2(RAMAdress : Integer) : Integer; external 'RORAMdll.dll';
    { Public-Deklarationen }
  end;


Das ist natürlich falsch. Besser wäre:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
type
  TForm1 = class(TForm)
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

function ReadRAM2(RAMAdress : Integer) : Integer; external 'RORAMdll.dll';

_________________
Ciao, Sprint.
bieberpelz Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26



BeitragVerfasst: Mo 12.09.05 15:14 
Satans ist das peinlich :oops:
Danke