![]() |
Typdeklarationen in C und Delphi
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:
Das sieht dann bei mir im Prinzip so aus:
int32 __CFUNC DAQmxCreateTask (const char taskName[], TaskHandle *taskHandle);
Delphi-Quellcode:
Das mit dem string wird natürlich nicht klappen. Array of pChar braucht eine feste Länge. PChar(string) geht in der Deklaration nicht.
function DAQmxCreateTask(const taskName : string; var taskHandle : TTASKHANDLE) : int32; external 'NICAIU.DLL';
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 |
Re: Kann eine Typdeklaration eine Anweisung erhalten?
Probier mal :
Delphi-Quellcode:
und Type Blub = Array of PChar; function DAQmxCreateTask(const taskName : Blub ; var taskHandle : TTASKHANDLE) : int32; external 'NICAIU.DLL';
Code:
müste
*taskHandle
Delphi-Quellcode:
sein. damit also
type PtaskHandle = ^TTASKHANDLE
Delphi-Quellcode:
Evtl reicht auch
function DAQmxCreateTask(const taskName : Blub ; var taskHandle : PtaskHandle ) : int32; external 'NICAIU.DLL';
Delphi-Quellcode:
und dann itterierst du durch Taskname durch bis du auf #0 stöst
function DAQmxCreateTask(const taskName : Pchar; var taskHandle : PtaskHandle ) : int32; external 'NICAIU.DLL';
|
Re: Kann eine Typdeklaration eine Anweisung erhalten?
Wenn man es mit "var" macht, übergibt Delphi doch automatisch (intern) einen Pointer, oder täusche ich mich da ?
|
Re: Kann eine Typdeklaration eine Anweisung erhalten?
Zitat:
Grüße, Messie |
Re: Kann eine Typdeklaration eine Anweisung erhalten?
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.
|
Re: Kann eine Typdeklaration eine Anweisung erhalten?
Delphi-Quellcode:
Bleibe lieber mit der Deklination der Typen so nah wie möglich am Original, um dir etwaiges Fehlverhalten zu ersparen.
type
PTaskHandle = ^TTaskhandle; function DAQmxCreateTask(const taskname : array of Char; taskhandle : PTaskHandle) : Int32; Edit: Auch bei so wenigen Wörtern kann man sich doch imens vertippen :p |
Re: Kann eine Typdeklaration eine Anweisung erhalten?
Hi
Delphi-Quellcode:
würde ich verwenden.
function DAQmxCreateTask(taskname : PChar; var taskhandle : TaskHandle) : Int32;
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:
oder direkt
var
sTaskname: string; taskhandle: TaskHandle; ... sTaskname := 'meinetask'; result := DAQmxCreateTask(pChar(sTaskname), taskhandle);
Delphi-Quellcode:
übergeben.
result := DAQmxCreateTask('meinetask', taskhandle);
Wenn man sich mal die unit windows anschaut - sofern man den Quellcode hat - findet man dutzende dieser Beispiele. Gruss |
Typdeklarationen in C und Delphi
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:
Grüße, Messie |
Re: Kann eine Typdeklaration eine Anweisung erhalten?
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. :angel:
Also solange der "String" nicht in der Funktion verändert wird.
Delphi-Quellcode:
function DAQmxCreateTask(const taskname: AnsiString; var taskhandle: TTaskHandle): LongInt;
|
Re: Typdeklarationen in C und Delphi
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz