AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Ansprechen einer C++ DLL von Delphi

Ein Thema von calibra301 · begonnen am 11. Aug 2016 · letzter Beitrag vom 12. Aug 2016
Antwort Antwort
Seite 1 von 2  1 2   
calibra301

Registriert seit: 20. Mär 2009
95 Beiträge
 
Delphi XE8 Professional
 
#1

Ansprechen einer C++ DLL von Delphi

  Alt 11. Aug 2016, 13:57
Delphi-Version: 5
Hallo,

hab eine C++ DLL mit folgendem Funktionsaufruf aus dem Header-File:

extern "C" DLLFunction void loadfile(int Target,const char* FileName);

In Delphi machte ich daraus:
function loadfile(Target:integer ;FileNameAnsiChar):Boolean;stdcall;external 'Digilabs.dll';

Aufruf der Funktion:
Procedure File_Laden(Name:String);
Var FileNameWideChar;
Begin
FileName:=PWideChar(Name);
loadfile(1,PAnsiChar(Name));
Beep;
end;

Kommt aber leider nie beim "Beep" an. Sobald er bei "loadfile" ist beendet sich das Programm...
Was mache ich falsch ?

Gruss
Calli
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Ansprechen einer C++ DLL von Delphi

  Alt 11. Aug 2016, 14:00
void ist eine procedure und keine Funktion mit Boolean Rückgabewert.
Bin mir nicht sicher was "DLLFunction" ist aber ggf. musst du stdcall durch cdecl ersetzen.

Edit: Und dein Cast eines Strings/PWidechars auf PAnsiChar wird auch in die Hose gehen.
Nimm direkt nen AnsiString oder du musst es richtig umwandeln.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Geändert von Neutral General (11. Aug 2016 um 14:03 Uhr)
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#3

AW: Ansprechen einer C++ DLL von Delphi

  Alt 11. Aug 2016, 14:01
Probier mal cdecl statt stdcall.
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#4

AW: Ansprechen einer C++ DLL von Delphi

  Alt 11. Aug 2016, 14:05
Bitte ergänze die Delphi-Tags um deinen Code.
Code:
[DELPHI]//...[/DELPHI]


Gut zu wissen: extern "C" stellt das C++-Name-Mangling aus und lässt das Ganze wie eine C-Funktion aussehen.
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
  Mit Zitat antworten Zitat
calibra301

Registriert seit: 20. Mär 2009
95 Beiträge
 
Delphi XE8 Professional
 
#5

AW: Ansprechen einer C++ DLL von Delphi

  Alt 12. Aug 2016, 05:47
Danke,

so funktionierts:

Delphi-Quellcode:
// Deklaration des Aufrufes der C++ DLL mit const char* FileName
function loadfile(Target:integer ;FileName:AnsiString):Boolean;cdecl;external 'Digilabs.dll';

// Aufruf der Funktion:
Procedure File_Laden(Name:String);
Begin
 loadfile(1,AnsiString(Name));
 Beep;
end;
Danke !
Calli
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.734 Beiträge
 
Delphi 2007 Professional
 
#6

AW: Ansprechen einer C++ DLL von Delphi

  Alt 12. Aug 2016, 08:02
hab eine C++ DLL mit folgendem Funktionsaufruf aus dem Header-File:

extern "C" DLLFunction void loadfile(int Target,const char* FileName);
so funktionierts:

Delphi-Quellcode:
// Deklaration des Aufrufes der C++ DLL mit const char* FileName
function loadfile(Target:integer ;FileName:AnsiString):Boolean;cdecl;external 'Digilabs.dll';

// Aufruf der Funktion:
Procedure File_Laden(Name:String);
Begin
 loadfile(1,AnsiString(Name));
 Beep;
end;
Wenn das funktioniert, dann nur mit viel Glück:
  • Du hast immer noch eine function, obwohl es eine procedure sein müsste.
  • FileName muss laut deiner C++-Deklaration ein PAnsiChar sein, definitiv kein Delphi-String.
Uli Gerhardt
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: Ansprechen einer C++ DLL von Delphi

  Alt 12. Aug 2016, 08:58
Delphi-Quellcode:
procedure loadfile(Target: integer; FileName: PAnsiChar);cdecl; external 'Digilabs.dll';

// Aufruf der Funktion:
procedure File_Laden(FileName: PAnsiChar);
begin
  loadfile(1, FileName);
  Beep;
end;
Na dann..

gruss
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#8

AW: Ansprechen einer C++ DLL von Delphi

  Alt 12. Aug 2016, 11:37
"Richtig"
Delphi-Quellcode:
// Deklaration des Aufrufes der C++ DLL mit const char* FileName
procedure loadfile(Target: Integer; FileName: PAnsiChar); cdecl; external 'Digilabs.dll';

// Aufruf der Funktion:
Procedure File_Laden(Name: AnsiString);
Begin
 loadfile(1, PAnsiChar(Name));
 Beep;
end;
Das geht nur, weil AnsiString intern "auch" wie ein PAnsiChar aussieht. (nutze ich auch gern mal bei Header-Übersetzung, um die AutoCasts nutzen zu können)
Und es geht auch nur bei IN-Parametern, die keine Mindestlänge verlangen und nil/NULL sein dürfen.
Ebenso UnicodeString und WideString nach PWideChar und String nach PChar.
Diese Typen habem zwar eine Längenangabe, aber für die Kompatibilität auch zusätzlich noch ein abschließendes #0.
Delphi-Quellcode:
// Deklaration des Aufrufes der C++ DLL mit const char* FileName
procedure loadfile(Target: Integer; FileName: AnsiString); cdecl; external 'Digilabs.dll';

// Aufruf der Funktion:
Procedure File_Laden(Name: String);
Begin
 loadfile(1, Name); // mit Auto-Konvertierung
 loadfile(1, AnsiString(Name)); // mit explizitem Cast (das unterdrückt auch die Warnung ab Delphi 2009, wegen des Unicodes)
 Beep;
end;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (12. Aug 2016 um 23:15 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.734 Beiträge
 
Delphi 2007 Professional
 
#9

AW: Ansprechen einer C++ DLL von Delphi

  Alt 12. Aug 2016, 11:40
Delphi-Quellcode:
// Deklaration des Aufrufes der C++ DLL mit const char* FileName
function loadfile(Target: Integer; FileName: AnsiString): Boolean; cdecl; external 'Digilabs.dll';
Procedure, procedure, procedure!
Uli Gerhardt
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#10

AW: Ansprechen einer C++ DLL von Delphi

  Alt 12. Aug 2016, 11:41
wie schon gesagt void ist keine Funktion.
Nebenbei "Richtig" kann auch "Falsch" sein.. LOL

gruss
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:06 Uhr.
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