Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Übergabe eines CStrings in Delphi an eine DLL-Funktion (https://www.delphipraxis.net/31301-uebergabe-eines-cstrings-delphi-eine-dll-funktion.html)

DXler 7. Okt 2004 00:00


Übergabe eines CStrings in Delphi an eine DLL-Funktion
 
Folgendes Problem:

Ich habe mich mit jemanden zusammengeschlossen und wir haben vor für die DVBs-Karte Nexus, die von TechnoTrend / Hauppauge hergestellt wird, ein Programm zu schreiben mit dem man TV gucken kann.

TechnoTrend hat hierfür ein SDK herausgebracht. Allerdings ist dies in C++ und wir wollen das in Delphi umsetzen.

Die Karte zu initialisieren haben wir bereits geschafft. Als nächster Schritt muß jetzt allerdings die Firmware der Karte geladen werden. Dies geschieht über eine Funktion die in einer DLL integriert ist (wie alle weiteren Funktionen auch). Um auf die Funktionen zuzugreifen, müssen die Funktionen in einer Klasse eingebettet sein (was kein Problem ist).

Hier ist nun die entsprechende C++-Funktion die die Firmware auf die Karte überträgt (der genaue Funktionsname ist geändert, damit wir nicht gegen die Lizenzbestimmung von TechnoTrend verstoßen):

Code:
DVB_ERROR xyz(CString* path);
"CString" ist in unseren Augen der Typ, der an die Routine übergeben werden muß. "path" ist die Variable die den Pfad zur Firmware enthält.


Im Beispiel, das dem SDK beiliegt, sieht der Aufruf wie folgt aus (Funktionsname: siehe weiter oben):

Code:
   CString sPath,s2,s3;
   GetExePath(sPath,s2,s3);
   sPath += CString("Boot\\") + "24" + CString("\\") ;

   error = abc.xyz(&sPath);
"abc" steht für die Klasse und "xyz" ist die Funktion.

Unsere Frage: wie sieht der 2. Teil entsprechend in Delphi aus?


Das Erstellen der Klasse für den Funktionsaufruf ist bereits erledigt und funktioniert.

Wir haben schon einige Variationen mit PChar probiert. Diese enden allerdings in einer "Access Violation" die sich (komischerweise?) auf die "MFC42.dll" bezieht.

supermuckl 7. Okt 2004 02:48

Re: Übergabe eines CStrings in Delphi an eine DLL-Funktion
 
ist wohl was erweitertes als ein string.. sowas wie ein objekt.. also ne intelligenter string :)

http://msdn.microsoft.com/library/de...ngs_topics.asp

Robert Marquardt 7. Okt 2004 06:35

Re: Übergabe eines CStrings in Delphi an eine DLL-Funktion
 
Zitat:

Zitat von DXler
Die Karte zu initialisieren haben wir bereits geschafft. Als nächster Schritt muß jetzt allerdings die Firmware der Karte geladen werden. Dies geschieht über eine Funktion die in einer DLL integriert ist (wie alle weiteren Funktionen auch). Um auf die Funktionen zuzugreifen, müssen die Funktionen in einer Klasse eingebettet sein (was kein Problem ist).

Wie denn das?

Zitat:

Zitat von DXler
Hier ist nun die entsprechende C++-Funktion die die Firmware auf die Karte überträgt (der genaue Funktionsname ist geändert, damit wir nicht gegen die Lizenzbestimmung von TechnoTrend verstoßen):

Was sind denn das fuer Idioten (sowohl in Lizenz als auch in API)?
Habt ihr ein NDA unterschrieben?

Zitat:

Zitat von DXler
Code:
DVB_ERROR xyz(CString* path);
"CString" ist in unseren Augen der Typ, der an die Routine übergeben werden muß. "path" ist die Variable die den Pfad zur Firmware enthält.

Das wird problematisch. CString ist eine C++ Klasse und sollte sich in Delphi nicht nachbauen lassen.

boonkerz 7. Okt 2004 08:39

Re: Übergabe eines CStrings in Delphi an eine DLL-Funktion
 
Hallo

Ich bin der zweite Mitspieler :-)

Mhm deswegen haben andere Software auch einen Wrapper in c++ geschrieben.

Gibts wirklich keine Möglichkeit?

MFG

DXler 7. Okt 2004 11:33

Re: Übergabe eines CStrings in Delphi an eine DLL-Funktion
 
Zitat:

Zitat:

Zitat von DXler
Die Karte zu initialisieren haben wir bereits geschafft. Als nächster Schritt muß jetzt allerdings die Firmware der Karte geladen werden. Dies geschieht über eine Funktion die in einer DLL integriert ist (wie alle weiteren Funktionen auch). Um auf die Funktionen zuzugreifen, müssen die Funktionen in einer Klasse eingebettet sein (was kein Problem ist).

Wie denn das?
Also: zuerst ruft man eine Funktion auf die dafür sorgt, das die DLL initialisiert wird. Wenn das geschehen ist, kann man auf die einzelnen Funktionen zugreifen.


Zugriff auf die Funktionen der DLL:

Die Funktionen der DLL sind in einzelne Bereiche aufgeteilt. Da gibt es z. B. einen Bereich der sich allgemein mit dem Board befasst. Ein weiterer ist für den Frontend (Betriebssystem) zuständig. Wieder ein anderer für ein angeschlossenes CI (Common Interface = dient der Entschlüsselung von PayTV-Programmen über eine Abo-Karte).

Diese einzelnen Bereiche werden über eine Klasse angesprochen. Vereinfacht ausgedrückt:

Es soll z. B. die Version des Frontends ausgegeben werden. Diese Funktion hat beispielsweise den Namen "FrontendVersion". Die Klasse heißt z. B. "NexusFrontend".

Dann ergibt sich daraus folgendes: NexusFrontend.FrontendVersion

Durch die Splittung der Funktionen in Bereiche wird das Ganze übersichtlicher und man weiß sofort, wo welche Funktion hingehört bzw. kann anhand der Klasse sehen, für welchen Bereich der Karte sie zuständig ist.

Was wir nun gemacht haben: wir haben von jedem Bereich eine Klasse erstellt (abgeleitet von TObject) und die dazugehörigen Funktionen als "Public" deklariert.

Das hab ich (in Kurzform) damit gemeint. :-D

Zitat:

Zitat:

Zitat von DXler
Hier ist nun die entsprechende C++-Funktion die die Firmware auf die Karte überträgt (der genaue Funktionsname ist geändert, damit wir nicht gegen die Lizenzbestimmung von TechnoTrend verstoßen):

Was sind denn das fuer Idioten (sowohl in Lizenz als auch in API)?
Habt ihr ein NDA unterschrieben?
Was die Leute bei TechnoTrend genau sind, kann ich nicht sagen (und da werd ich mich auch nicht zu äußern). Jedenfalls sind es die einzigen, die meines Wissens Programmierern überhaupt Hilfe geben! Andere Kartenhersteller lassen alles "closed" und geben keine Infos heraus.

Das "Lizenzabkommen" von TechnoTrend gibt es hier.

zorro888 29. Nov 2011 10:42

AW: Übergabe eines CStrings in Delphi an eine DLL-Funktion
 
Hallo,

bin auch am programmieren mit Borland Builder 6.0
Ebenso Nexus Karte
Hätte interesse an Quellcode.

Grüße Zorro


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:20 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