Entwickler-Ecke
Dateizugriff - Array von DLL befüllen lassen.
Holg_i - Do 18.08.11 17:35
Titel: Array von DLL befüllen lassen.
in C habe ich folgenden Code:
C#-Quelltext
1: 2: 3: 4:
| int MyResult int MyArray[31];
MyResult = DLL_Abfrage(myArray); |
das geht auch echt fein. In VB:
Quelltext
1: 2: 3: 4:
| Dim MyResult As Long Dim MyArray(0 to 31) As Long
MyResult = DLL_Abfrage(MyArray(0)) |
geht auch
ABER
Delphi-Quelltext
1: 2: 3: 4:
| MyArray: Array[0..31] of LongInt; MyResult: LongInt;
MyResult = DLL_Abfrage(MyArray[0]); |
bringt Laufzeitfehler.
Was mache ich falsch???
Moderiert von
Narses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Do 18.08.2011 um 18:52
BenBE - Do 18.08.11 18:00
Punkt 1: Dein VB-Code deklariert ein Array, was einen Eintrag. Zu gross ist.
Zudem: Wie bindest du die Funktion jeweils ein? Wie ist sie im Original deklariert?
Denn ohne die Deklaration kann man da recht wenig sagen.
Ach ja: Don't ever use int for anything that should work!
Delphi-Laie - Do 18.08.11 19:24
Holg_i hat folgendes geschrieben : |
Was mache ich falsch??? |
Den Delphi-Quelltext hier zurückzuhalten.
elundril - Do 18.08.11 21:55
Delphi-Quelltext
1: 2: 3: 4:
| MyArray: Array[0..31] of LongInt; MyResult: LongInt;
MyResult = DLL_Abfrage(MyArray[0]); |
Ist das in der letzten zeile absichtlich eine Abfrage oder sollte das eine Zuweisung sein? Ich schieß mal so ins Blaue aber kanns sein das der vl nur nen Pointer aufs Array haben mag? Weil in C is ja n Array eig. nur Pointergeballere, was ich mich so an meine wenigen Stunden C erinnern kann.
lg elundril
HelgeLange - Do 18.08.11 22:35
Ausserdem aufpassen in Delphi mit dem Speicher des Arrays, soalnge Du die RTLXXX.BPL nicht dynamisch einbindest, nutzen Hauptprogramm und DLL unterschiedliche Speichermanager.
Ausserdem musst/willst Du sicherlich das Array als Pointer übergeben, ich glaub, das geht eher so:
Delphi-Quelltext
1:
| MyResult = DLL_Abfrage(@MyArray[0]); |
Ist allerdings sehr abhängig von der Deklaration in der DLL. Ausserdem mal schaun, dass beides gleich als cdecl oder so registriert ist.
Holg_i - Fr 19.08.11 08:54
Nun so noch mal den ganzen Code
Quelltext
1: 2: 3: 4: 5: 6:
| Private Declare Function DLL_Abfrage Lib "jetr.dll" Alias "FillA" (Inhalt As Long) As Long Private Sub testBtn_Click() Dim retValue As Long Dim MyArray(0 To 31) As Long retValue = DLL_Abfrage(MyArray(0)) End Sub |
Das geht im Array steht das was die DLL übergibt. In Delphi:
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: 47:
| unit Haupt; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) Button1: TButton; procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure Button1Click(Sender: TObject); private DLL_Abfrage: function(Inhalt: LongInt): LongInt; stdcall; public handelDLL: HINST; end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin handelDLL:=0; handelDLL := LoadLibrary('jetr.dll'); if handelDLL = 0 then begin MessageBox(0,'DLL Ladefehler','ERROR',MB_OK or MB_ICONSTOP); Application.Terminate; end else begin DLL_Abfrage:= GetProcAddress(handelDLL,'FillA'); end; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin FreeLibrary(handelDLL); end; procedure TForm1.Button1Click(Sender: TObject); var MyArray: Array[0..31] of LongInt; retValue: LongInt; begin retValue:= DLL_Abfrage(MyArray[0]); end; end. |
Geht das nicht. Ich verstehe das einfach nicht.
Holg_i - Fr 19.08.11 10:57
Danke ich habe es hinbekommen:
Delphi-Quelltext
1:
| DLL_Abfrage: function(Inhalt: LongInt): LongInt; stdcall; |
muss
Delphi-Quelltext
1:
| DLL_Abfrage: function(Inhalt: Pointer): LongInt; stdcall; |
sein. Die Abfrage muss
Delphi-Quelltext
1:
| retValue:= DLL_Abfrage(@MyArray); |
sein und nicht
Delphi-Quelltext
1:
| retValue:= DLL_Abfrage(MyArray[0]); |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!