![]() |
PChar Übergabe an C DLL funktioniert nicht
Hallo Leute
Ich schreibe gerade ein Delphi Programm für eine Messkarte von ADLINK Der Hersteller hat leider nur eine Pascal Unit mitgeliefert und einige Beispiele in C. Hier werden z.B. Daten der Messkarte ausgelesen und in einer Datei abgespeichert.
Code:
Meine Umsetzung in Delphi sieht so aus:
#include "dask.h"
U16 channel=3; //4 channels U16 range=AD_B_5_V; char *file_name="9112d"; U32 read_count=1000; F64 sample_rate=10000; main() { I16 card, err, card_num; printf("This program inputs %d data from CH-%d to CH-0 of PCI-9112 in %d Hz, and\nstore data to file '%s.dat'.\n\nPress any key to start the operation.\n", read_count, channel, (int)sample_rate, file_name); printf("Please input a card number: "); scanf(" %d", &card_num); //getch(); if ((card=Register_Card (PCI_9112, card_num)) <0 ) { printf("Register_Card error=%d\n", card); exit(1); } err = AI_9112_Config(card, TRIG_INT_PACER); if (err!=0) { printf("AI_9112_Config error=%d", err); exit(1); } err = AI_AsyncDblBufferMode(card, 0); if (err!=0) { printf("AI_DblBufferMode error=%d", err); exit(1); } err = AI_ContScanChannelsToFile(card, channel, range, file_name, read_count, sample_rate, SYNCH_OP); if (err!=0) { printf("AI_ContReadChannel error=%d", err); exit(1); } Release_Card(card); printf("\n\nThe input data is already stored in file '%s.dat'.\n", file_name); printf("\nPress ENTER to exit the program. "); getch(); }
Delphi-Quellcode:
Die Routine AI_ContScanChannelsToFile macht Probleme bei der Übergabe von file_name.
procedure TAKonForm.daskClick(Sender: TObject);
{------------------------------------------------------------------------------+ Messkarte testen ------------------------------------------------------------------------------} var err,card,card_num : Smallint; channel,range : Word; file_name : PChar; read_count : Cardinal; sample_rate : Double; begin channel := 3; range := AD_B_5_V; file_name := '9112d'; read_count := 1000; sample_rate :=10000; card_num := 0; card := Register_Card(PCI_9112, card_num); if card<0 then begin MessageDlg('Register_Card error. Card:'+ IntToStr(card), mtError, [mbOK], 0); exit; end; err := AI_9112_Config(card, TRIG_INT_PACER); if err<>0 then begin MessageDlg('AI_9112_Config error '+ IntToStr(err), mtError, [mbOK], 0); exit; end; err := AI_AsyncDblBufferMode(card, 0); if err<>0 then begin MessageDlg('AI_DblBufferMode error '+ IntToStr(err), mtError, [mbOK], 0); exit; end; err := AI_ContScanChannelsToFile(card, channel, range, file_name, read_count, sample_rate, SYNCH_OP); if err<>0 then begin MessageDlg('AI_ContReadChannel error '+ IntToStr(err), mtError, [mbOK], 0); exit; end; Release_Card(card); end; Das erzeugte File sollte 9112d.dat heissen, tatsächlich wird aber ein File mit Namen ÌtI.dat erzeugt. Die Unit sieht an der Stelle so aus:
Delphi-Quellcode:
Die Unit habe ich modifiziert.
function AI_ContScanChannelsToFile (CardNumber:Word; Channel:Word; AdRange:Word;
var FileName:PChar; ReadCount:Cardinal; SampleRate:Double; SyncMode:Word):Smallint;stdcall; "var FileName:PChar" war ursprünglich "var FileName:Char" Der zugehörige C DLL Header:
Code:
I16 __stdcall AI_ContScanChannelsToFile (U16 CardNumber, U16 Channel, U16 AdRange,
U8 *FileName, U32 ReadCount, F64 SampleRate, U16 SyncMode); Ich habe jetzt schon einiges probiert. Unter anderem habe ich die Unit mit dem Programm HeadConv V4.20 frisch erzeugt. Der Konverter gibt FileName das Format Byte, was mir aber auch nicht weiterhilft. Ich will ja einen String übergeben. Letztendlich macht die selbst erzeugte Unit die gleichen Probleme wie die mitgelieferte. Langsam bin ich ratlos. |
Re: PChar Übergabe an C DLL funktioniert nicht
Nimm mal das "var" bei dem PChar raus!
|
Re: PChar Übergabe an C DLL funktioniert nicht
Zitat:
Freu :) Danke Sirius! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:34 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