AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi PChar Übergabe an C DLL funktioniert nicht
Thema durchsuchen
Ansicht
Themen-Optionen

PChar Übergabe an C DLL funktioniert nicht

Ein Thema von daedalus · begonnen am 20. Aug 2008 · letzter Beitrag vom 20. Aug 2008
Antwort Antwort
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
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: PChar Übergabe an C DLL funktioniert nicht

  Alt 20. Aug 2008, 12:30
Nimm mal das "var" bei dem PChar raus!
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
daedalus

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

Re: PChar Übergabe an C DLL funktioniert nicht

  Alt 20. Aug 2008, 12:45
Zitat von sirius:
Nimm mal das "var" bei dem PChar raus!
Bingo!

Freu

Danke Sirius!
  Mit Zitat antworten Zitat
Antwort Antwort


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 17:06 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