AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Typdeklarationen in C und Delphi

Ein Thema von messie · begonnen am 23. Mär 2009 · letzter Beitrag vom 31. Mär 2009
Antwort Antwort
Seite 1 von 3  1 23      
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#1

Typdeklarationen in C und Delphi

  Alt 23. Mär 2009, 18:36
Moin,

ich versuche seit einigen Tagen, ein Messgerät von National Instruments unter Delphi zum Laufen zu bringen. Ich habe eine Headerdatei und eine c-lib, die per OLE auf die tatsächliche dll zugreift. Technisch gesehen ziemlicher Unsinn weil zu langsam.

Meine aktuelle Frage: ich würde gerne aus dieser Deklaration (stellvertretend für einige hundert) einen Delphi-Aufruf machen:

Code:
int32 __CFUNC    DAQmxCreateTask         (const char taskName[], TaskHandle *taskHandle);
Das sieht dann bei mir im Prinzip so aus:function DAQmxCreateTask(const taskName : string; var taskHandle : TTASKHANDLE) : int32; external 'NICAIU.DLL'; Das mit dem string wird natürlich nicht klappen. Array of pChar braucht eine feste Länge. PChar(string) geht in der Deklaration nicht.
Gibt es eine Möglichkeit, einen nullterminierten string als Typ zu deklarieren?

Die Basis der Übersetzungen kommt aus Dr. Bob's Tool, was doch ziemlich gestolpert ist. National Instruments gibt eine pas-Datei heraus, die vergleichbar ist und auch voller Fehler steckt (sieht auch automatisch übersetzt aus - Delphi wird von NI nicht unterstützt). Die wollen ja auch ihre überteuerten Labview-Lizenzen verkaufen.
Dabei haben sie leider die Performance vergessen. Das Problem wird sicher noch mehr Fragen aufwerfen...

Danke, Messie
  Mit Zitat antworten Zitat
Benutzerbild von Corpsman
Corpsman

Registriert seit: 8. Nov 2005
Ort: nähe Stuttgart
981 Beiträge
 
Delphi XE2 Professional
 
#2

Re: Kann eine Typdeklaration eine Anweisung erhalten?

  Alt 23. Mär 2009, 18:50
Probier mal :

Delphi-Quellcode:

Type Blub = Array of PChar;

function DAQmxCreateTask(const taskName : Blub ; var taskHandle : TTASKHANDLE) : int32; external 'NICAIU.DLL';
und

Code:
*taskHandle
müste
type PtaskHandle = ^TTASKHANDLE sein. damit also
function DAQmxCreateTask(const taskName : Blub ; var taskHandle : PtaskHandle ) : int32; external 'NICAIU.DLL'; Evtl reicht auch
function DAQmxCreateTask(const taskName : Pchar; var taskHandle : PtaskHandle ) : int32; external 'NICAIU.DLL'; und dann itterierst du durch Taskname durch bis du auf #0 stöst
Uwe
My Sitewww.Corpsman.de

My marble madness clone Balanced ( ca. 70,0 mb ) aktuell ver 2.01
  Mit Zitat antworten Zitat
mr_emre_d
(Gast)

n/a Beiträge
 
#3

Re: Kann eine Typdeklaration eine Anweisung erhalten?

  Alt 23. Mär 2009, 19:12
Wenn man es mit "var" macht, übergibt Delphi doch automatisch (intern) einen Pointer, oder täusche ich mich da ?
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#4

Re: Kann eine Typdeklaration eine Anweisung erhalten?

  Alt 23. Mär 2009, 19:22
Zitat von Corpsman:
Evtl reicht auch
function DAQmxCreateTask(const taskName : Pchar; var taskHandle : PtaskHandle ) : int32; external 'NICAIU.DLL';
Ja, da möchte ich nochmal nachfragen: ist in der oben gezeigten Deklaration PChar gleich array of PChar? Das würde sinnvoll erscheinen. Bei bestimmten Funktionen aus der WinAPI ist das so, nun weiß ich nicht, ob das allgemein in Delphi gilt.

Grüße, Messie
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Kann eine Typdeklaration eine Anweisung erhalten?

  Alt 23. Mär 2009, 19:31
const char [] ist ein Array of AnsiChar mit unbekannter Länge, vermutlich also ein PAnsiChar. Array of PChar ist garantiert falsch. Beim zweiten Parameter kann entweder explizit ein Zeiger übergeben werden oder es wird var verwendet. Außerdem musst du noch mit der Aufrufkonvention aufpassen.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Kann eine Typdeklaration eine Anweisung erhalten?

  Alt 23. Mär 2009, 19:33
Delphi-Quellcode:
type
PTaskHandle = ^TTaskhandle;

function DAQmxCreateTask(const taskname : array of Char; taskhandle : PTaskHandle) : Int32;
Bleibe lieber mit der Deklination der Typen so nah wie möglich am Original, um dir etwaiges Fehlverhalten zu ersparen.

Edit: Auch bei so wenigen Wörtern kann man sich doch imens vertippen :p
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  Mit Zitat antworten Zitat
Benutzerbild von thkerkmann
thkerkmann

Registriert seit: 7. Jan 2006
Ort: Pulheim Brauweiler
464 Beiträge
 
Delphi 2010 Professional
 
#7

Re: Kann eine Typdeklaration eine Anweisung erhalten?

  Alt 23. Mär 2009, 19:49
Hi
function DAQmxCreateTask(taskname : PChar; var taskhandle : TaskHandle) : Int32; würde ich verwenden.

Im Original heisst es const char tastkname[], was zeigt dass ein Pointer übergeben wird, wobei die Daten auf die er zeigt nicht verändert werden sollen.
taskhandle dagegen ist ein Rückgabewert und sollte als var deklariert werden. Damit wird automatisch ebenfalls ein Pointer auf diese Variable übergeben.

Ein string läßt sich dann einfach mit
Delphi-Quellcode:
var
  sTaskname: string;
  taskhandle: TaskHandle;
  ...
  sTaskname := 'meinetask';
  result := DAQmxCreateTask(pChar(sTaskname), taskhandle);
oder direkt
  result := DAQmxCreateTask('meinetask', taskhandle); übergeben.

Wenn man sich mal die unit windows anschaut - sofern man den Quellcode hat - findet man dutzende dieser Beispiele.

Gruss
Thomas Kerkmann
Ich hab noch einen Koffer in Borland.
http://thomaskerkmann.wordpress.com/
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#8

Typdeklarationen in C und Delphi

  Alt 24. Mär 2009, 10:35
Ich habe TTaskHandle jetzt auch als Pointer bezeichnet, kommt dem Original void* doch am nächsten

Um jetzt keinen neuen Thread eröffen zu müssen:

Was ist denn bitte
Zitat:
typedef unsigned __int64
für ein Typ in Delphi? Denn cardinal endet ja bei 32 bit.

Grüße, Messie
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Kann eine Typdeklaration eine Anweisung erhalten?

  Alt 24. Mär 2009, 12:41
Statt einem PAnsiChar kann man sogar einen AnsiString verwenden, da dessen interner Zeiger auf den Textanfang und nicht auf den Anfang der String-Struktur zeigt und am Ende sogar eine #0 angehängt ist.
Also solange der "String" nicht in der Funktion verändert wird.
function DAQmxCreateTask(const taskname: AnsiString; var taskhandle: TTaskHandle): LongInt;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Zoot

Registriert seit: 30. Jan 2006
Ort: Hessen
110 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: Typdeklarationen in C und Delphi

  Alt 24. Mär 2009, 12:53
Zitat von messie:
Was ist denn bitte
Zitat:
typedef unsigned __int64
für ein Typ in Delphi? Denn cardinal endet ja bei 32 bit.

Grüße, Messie
UInt64.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 05:29 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