Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Stringübergabe an C# DLL funzt nicht (https://www.delphipraxis.net/177737-stringuebergabe-c-dll-funzt-nicht.html)

Testsieger 25. Nov 2013 07:18

Stringübergabe an C# DLL funzt nicht
 
Hallo,
ich habe ein Problem mit der Stringübergabe von Delphi (XE4) an eine C# DLL.
Über die DLL habe ich die Info, dass die Funktion so definiert sein soll:

int __stdcall spssOpenRead(
const char* fileName,
int* hFile);

Ich habe die DLL ordnungsgemäß eingebunden:

Function spssOpenRead(fileName:pchar;hFile:Integer):Integer ;stdcall; external 'spssio32.dll' name 'spssOpenRead';

Mein Problem ist, dass ich es nicht schaffe der DLL den „Filename“ zu übergeben.
Mein Aufruf sieht wie folgt aus:

Procedure click;
var iii,handle1:integer;
mm1:pchar;
begin
handle1:=1;
mm1:= 'ergaenz.sav';
iii:=spssOpenRead(mm1,handle1);
showmessage(inttostr(iii));
end;

Es führt immer zu einem Programmabbruch:
Exception der Klasse $C000005 mit der Meldung: „access violation“…
Da es in der DLL auch noch andere Funktionen gibt, die mit Integer-Werten arbeiten,
habe ich diese Funktionen mal getestet und bekomme vernünftige Werte zurückgeliefert,
so dass der Fehler „nur“ in der String-Übergabe zu suchen ist.
Ich habe doch Pointer-Variablen für die Übergabe verwendet, kann mir jemand helfen?

Lemmy 25. Nov 2013 07:33

AW: Stringübergabe an C# DLL funzt nicht
 
Hi,

versuch mal das hier:

Delphi-Quellcode:
Procedure click;
var iii,handle1:integer;
   mm1:String; //hier
begin
  handle1 := 1;
  mm1 := 'ergaenz.sav';
  iii := spssOpenRead(PChar(mm1),handle1); //hier auch noch
  showmessage(inttostr(iii));
end;

Testsieger 25. Nov 2013 07:37

AW: Stringübergabe an C# DLL funzt nicht
 
Danke für den Tipp, Lemmy, aber es gibt leider dieselbe Fehermeldung.

Testsieger 25. Nov 2013 07:39

AW: Stringübergabe an C# DLL funzt nicht
 
Bei meinen Versuchen hatte ich auch schon mit string gearbeitet und ein testweise "#0" angehängt. Leider auch ohne Erfolg.

Bernhard Geyer 25. Nov 2013 07:41

AW: Stringübergabe an C# DLL funzt nicht
 
Probier mal mit Ansi-String zu arbeiten. Bei C#/.NET kann man angeben welche Codierung (unicode/ansi) eine Funktion hat. Evtl. hat diese ja eine Ansi-Signatur.

DeddyH 25. Nov 2013 07:46

AW: Stringübergabe an C# DLL funzt nicht
 
Und absolute Pfade sind wahrscheinlich auch sinnvoller.

Testsieger 25. Nov 2013 07:47

AW: Stringübergabe an C# DLL funzt nicht
 
Leider auch nicht.

DeddyH 25. Nov 2013 07:50

AW: Stringübergabe an C# DLL funzt nicht
 
Die Aufrufkonvention ist wirklich stdcall, oder könnte es auch z.B. cdecl sein?

Testsieger 25. Nov 2013 07:53

AW: Stringübergabe an C# DLL funzt nicht
 
hab ich auch schon probiert, obwohl es in der Beschreibung "stdcall" heisst.
Ich teste es aber mal mit den neuen Vorschlägen (string/ansistring)

Testsieger 25. Nov 2013 07:57

AW: Stringübergabe an C# DLL funzt nicht
 
@deddyH: Ich habs nur für das Forum abgekürzt. Da steht der komplette Pfad drin und wenn der falsch ist, sollte eine korrekte Fehlermeldung im Parameter "iii" stehen.
Aber soweit kommt es leider gar nicht:

access violaton at ... writing at ...

Der "Zeiger" kommt nicht richtig in der DLL an. Es ist immer dieselbe Adresse!

Übrigens: "cdecl" hat auch nicht gefunzt. Die andere Funktion aus der DLL, die ich getestet habe konnte ich auch über "stcall" aufrufen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:28 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz