2011-01-06 13 views
1

Ist es möglich, C-Header mit dem Rad Studio XE C++ - Compiler zu kompilieren und sie mit Delphi-Code zu verknüpfen?Kann ich C-Header in Delphi verwenden?

So beseitigt die Notwendigkeit, Header-Dateien in Pascal zu konvertieren?

Der Grund für die Frage ist ..

C - Kopf Definition:

DLLEXPORT int url_engine_version(char *version, size_t length); 

Versuch Delphi Definition

function url_engine_version(version: PByte; var length: cardinal): integer; 
    cdecl; external 'corplib.dll'; 

Haupt App versucht, es zu nennen mit:

engVer: Pointer; 
engLen: cardinal; 

engLen := 64; 
GetMem(engVer,engLen); 
url_engine_version(engVer,engLen); 

Aber Delphi AV's, wenn es versucht, die Routine aufzurufen.

Working C# Definition - Küken funktioniert, wenn ich einen String predefinded als Länge 64

[DllImport("corplib.dll", CharSet = CharSet.Ansi, 
      CallingConvention = CallingConvention.Cdecl)] 
public static extern int url_engine_version(StringBuilder version, [Out] int length); 
+0

Ist stdcall nicht einfach? –

+0

Sind Sie sicher, dass wirklich der Delphi-Code abstürzt und nicht die DLL-Funktion abstürzt? Die AV-Fehlermeldung zeigt Ihnen, zu welchem ​​Modul der fehlerhafte Code gehört. –

Antwort

2

Die Antwort auf Ihre eigentliche Frage ist: Nein. Entschuldigung.

Aber ich denke, in diesem Fall das Problem ist ganz einfach ...

entweder die C-Header Sie hier wiedergegeben haben, ist falsch, oder die C# Erklärung ist, oder Sie haben einfach sehr viel Glück nicht die C# haben Code-Crash und brennen so schlecht wie der Delphi-Code.

Das Problem, das ich glaube, ist, dass die C-Header die Länge Parameter als SIZE_T erklärt, NICHT ein Zeiger auf eine SIZE_T. d.h. es ist ein Eingabeparameter, kein Ausgabeparameter oder In/Out-Parameter.

Sie verwenden vermutlich Länge die Größe des Puffers für den Zeiger Sie in Version geben zugeordnet angeben. Ich nehme weiter an, dass die Funktion die Anzahl der tatsächlichen Bytes zurückgibt, die für die Daten verwendet werden, die in der Version Puffer abgelegt werden.

Die Delphi-Version stürzt ab, glaube ich, weil durch Länge als var Angabe Sie Länge durch Bezugnahme sind vorbei, dh die Funktion nicht „64“ empfängt, sondern ein Zeiger auf den Wert „64“, aber es verwendet diesen Zeigerwert, nicht den 64-Wert.

Der C# -Code kann das Bullet durch (auch falsch, wenn der C-Header selbst korrekt ist) ausweichen und den Parameter als out deklarieren. Dies kann sich in etwas übersetzen, das, wenn es nicht korrekt ist, zur Laufzeit nicht so "schädlich falsch" ist.

Ich denke einfach die „var“ von der Länge Parameterdeklaration zu entfernen sollte Ihr Problem lösen:

function url_engine_version(aVersion: PByte; aLength: cardinal): integer; cdecl; external 'corplib.dll'; 
+0

Perfekt. Sie sind genau richtig. Der C-Header ist korrekt und die Länge ist nach Wert, nicht nach Referenz. Durch das Entfernen der var wurde das Problem behoben. Über die C# Version auch zu beheben. THANKYOU SEHR VIEL ... – user296191

+0

Der Benutzer sollte auch bestätigen, dass sein "size_t" des C-Compilers die gleiche Größe wie Delphis "Cardinal" hat (was 4 Bytes ist). –

+0

@Rob: size_t ist ein Standard-C/C++ - definierter Typ, der Cardinal (auf Win32) entspricht, siehe: http://en.wikipedia.org/wiki/Size_t – Deltics

0

Das Hauptproblem bei Umwandlung sind Unterschiede in der Art System übergeben. Ein guter Delphi-Header kann nicht von c abgeleitet werden.

Zum Beispiel unterscheidet c nicht Zeiger auf ein Element und Zeiger auf Arrays. Es unterscheidet nicht Bools und Ints. Eine char* kann bedeuten, eine Null terminierte Zeichenfolge, ein Zeiger auf Bytes, ein Zeiger auf ein einzelnes Zeichen, ein Zeichen durch Referenz übergeben, ...

Und in Ihrem Beispiel übergibt der Delphi-Code den letzten Parameter als Referenz (dh als Zeiger auf UInt32) und der c-Code nicht. Aber ich verstehe nicht, warum der C# -Code funktioniert.

0

Projekt JEDI hat viele C-Header-Konvertierungen für Delphi durchgeführt. Sie haben eine ausgezeichnete Reihe von Ressourcen, Tutorials usw. auf ihre website.

Sie haben auch ein Werkzeug, das dies automatisieren kann, das tatsächlich von Originalcode von Bob Swart abgeleitet wurde.

+0

Danke .. Wird die Website meiner Sammlung hinzufügen. – user296191

Verwandte Themen