Einzelnen Beitrag anzeigen

daedalus

Registriert seit: 31. Jan 2004
Ort: Aalen
14 Beiträge
 
Delphi 2005 Professional
 
#1

PChar Übergabe an C DLL funktioniert nicht

  Alt 20. Aug 2008, 11:25
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:
#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();
}

Meine Umsetzung in Delphi sieht so aus:

Delphi-Quellcode:
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;
Die Routine AI_ContScanChannelsToFile macht Probleme bei der Übergabe von file_name.
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:
function AI_ContScanChannelsToFile (CardNumber:Word; Channel:Word; AdRange:Word;
               var FileName:PChar; ReadCount:Cardinal; SampleRate:Double; SyncMode:Word):Smallint;stdcall;
Die Unit habe ich modifiziert.
"var FileNameChar" 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.
  Mit Zitat antworten Zitat