Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi C++ DLL in delphi einbinden (https://www.delphipraxis.net/49021-c-dll-delphi-einbinden.html)

mensah 4. Jul 2005 13:04


C++ DLL in delphi einbinden
 
Hallo liebe leute,
kann mir jemand helfen?
Ich habe ein C++ DLL in delphi eingebunden,es geht um ein EEG-Verstärker,der ein Signal(Sinusförmiges)ausgeben sollte.ich habe die functionen mit Stdcall;external;(" DLL Name") aufgerufen.leider kommt es kein Signal raus.ich bin euch dankbar für jede hilfe.

JasonDX 4. Jul 2005 13:10

Re: C++ DLL in delphi einbinden
 
Erstmal:
Herzlich Willkommen in der DP! :party:


Zitat:

Zitat von mensah
Ich habe ein C++ DLL in delphi eingebunden,es geht um ein EEG-Verstärker,der ein Signal(Sinusförmiges)ausgeben sollte.ich habe die functionen mit Stdcall;external;(" DLL Name") aufgerufen.leider kommt es kein Signal raus.ich bin euch dankbar für jede hilfe.

Versuch mal, die DLL in C++ einzubinden und schau, ob dann ein Signal rauskommt. Normalerweise, wenns bei der Einbindung der DLL beim Aufruf der Funktion happert, kriegt man ne AV.
Deshalb denke ich, es liegt eher an der DLL als an der Einbindung. Aber etwas Code würde die Fehlersuche etwas erleichtern, bspw. wie du die DLL einbindest, die Funktion aufrufst oder der Funktionskopf in der DLL aussieht.



[Edit]Grammatik ist doof[/edit]

Robert Marquardt 4. Jul 2005 13:17

Re: C++ DLL in delphi einbinden
 
Poste doch mal das .h File hier wenn es nicht zu lang ist (und vergiss die Code-Tags nicht).

mensah 4. Jul 2005 13:21

Re: C++ DLL in delphi einbinden
 
Hi Mike,
danke erstmal,
der DLL wurde von einem Profi C++ Programmierer, er meint es tritt kein problem bei ihm auf ,da er leider kein delphi kann,komme ich nicht weiter.
Meine Code kann ich dir schicken.:-)

Robert Marquardt 4. Jul 2005 13:23

Re: C++ DLL in delphi einbinden
 
Es geht erst mal darum ob die DLL eine C++ Klasse exportiert oder normale C Funktionen.
C++ Klasse heisst Pech gehabt mit Delphi.

mensah 4. Jul 2005 13:28

Re: C++ DLL in delphi einbinden
 
die h-file habe ich leider nicht, da der C++ DLL-Hersteller sicher ist, dass es ein mann frei geht, will er nicht geben.

JasonDX 4. Jul 2005 13:33

Re: C++ DLL in delphi einbinden
 
Zitat:

Zitat von Robert Marquardt
Es geht erst mal darum ob die DLL eine C++ Klasse exportiert oder normale C Funktionen.
C++ Klasse heisst Pech gehabt mit Delphi.

Ich denke nicht, dass er es geschafft hat, ohne AV o.Ä. eine C++-Klasse aus einer DLL zu importieren ;)


Zitat:

Zitat von mensah
der DLL wurde von einem Profi C++ Programmierer, er meint es tritt kein problem bei ihm auf ,da er leider kein delphi kann,komme ich nicht weiter.

Es kann auch sein, dass es bei seinem PC funktioniert, aber bei deinem nicht, also Hardware-problem. Interessant dafür wär zu wissen, wo der Ausgang hinsoll: Soundausgang, spezieller Ausgang bei einer Zusätzlich installierten Hardware, einfach nur Bildschirm ect.
Im Falle eines Hardwareproblems könntest du den Programmierer um die Anforderungen für die DLL bitten, und wenns Support für das Teil gibt, haste Glück gehabt ;)

Zitat:

Zitat von mensah
Meine Code kann ich dir schicken.:-)

Du kannst ihn auch gern hier reinposten. (Muss nicht der ganze sein, ist eh nur besser, wenn du den Code auf den wichtigsten Teil kürzt, nämlich wo/wie du die Funktion einbindest und sie aufrufst ;) )

mensah 4. Jul 2005 13:36

Re: C++ DLL in delphi einbinden
 
momemt.ich muss erst offline,bin gerade in der Bibo wo keine USB-Einkopplung möglich ist, dann bin ich in 20 min wieder online

mensah 4. Jul 2005 14:02

Re: C++ DLL in delphi einbinden
 
hier das Code:
die Deklaration der Functionen:

Delphi-Quellcode:
.
.
.
function GetBlockValues(pValues: array of single):integer;{$IFDEF WIN32}stdcall;external 'DiggerClient.dll'; {$ENDIF}
function GetBlockValuesEx (pValues: array of single;numVec:integer):integer;{$IFDEF WIN32}stdcall;external 'DiggerClient.dll';{$ENDIF}
function GetNumAvailableDataVec:integer;{$IFDEF WIN32}stdcall;external 'DiggerClient.dll'; {$ENDIF}
function WaitForNumVec(numVecToWait:integer):integer;{$IFDEF WIN32}stdcall;external 'DiggerClient.dll';{$ENDIF}[pre]

// Messung starten
   Starttick:=GetTickCount;
   Startzeit:=Now;

   if MaxChannels=UseChannels then
      // alle Kanäle
      StatusBar1.SimpleText:='Startstatus: '+IntToStr(StartMessung)
   else
   begin
      // nur einige Kanäle
//      SetLength(Kanaele,UseChannels);
      for i:=0 to UseChannels-1 do
         Kanaele[i]:=i;
      //test:=StartMessungEx(Kanaele, UseChannels);
      test:=StartMessung;

      //PKanaele:=@Kanaele;
      //test:=StartMessungEx(PKanaele, UseChannels);
      memo1.Text:=IntToStr(test);
   end;

//   ButtonStopClick(Sender);
end;

procedure TForm1.ButtonStopClick(Sender: TObject);
var AnzahlDaten:Integer;
    Puffer:array of single;
    i,j,k,Fenster:Integer;
    stl:TStrings;
    Zeile:String;
    t:DWORD;
begin
   if not InitOK then
      Exit;

   Memo1.Text:=IntToStr(WaitForNumVec(10));

   // Messzeit anzeigen (Zeit zwischen Start und Stop Klicken; nur intern gemessen)
   LabeledEditMesszeit.Text:=IntToStr(GetTickCount-Starttick);
   // Messung stoppen
   StopMessung;

   // 1,5s warten um Verarbeitung in DLL zu ermöglichen (evtl. reduzieren)
   t:=GetTickCount;
   while (GetTickCount-t)<1500 do
      Application.ProcessMessages;
   // wieviele Daten wurden gesammelt?
   //AnzahlDaten:=GetNumAvailableDataVec;
   AnzahlDaten:=20000;
   // Puffergröße einstellen
   SetLength(Puffer,AnzahlDaten*UseChannels);
   AnzahlDaten:=GetBlockValuesEx(Puffer,AnzahlDaten);
   Memo1.Text:=IntToStr(AnzahlDaten);

   // Diagramm füllen
   for i:=0 to UseChannels-1 do
      for j:=0 to AnzahlDaten-1 do
      try
         Chart1.Series[i].AddY(Puffer[{j*UseChannels+i}i*AnzahlDaten+j]);
      except
         Memo1.Lines.Add(IntToStr(UseChannels)+';'+IntToStr(AnzahlDaten)+';'+IntToStr(i)+';'+IntToStr(j)+';'+FloatToStr(Puffer[{j*UseChannels+i}i*AnzahlDaten+j]));
      end;

   // Daten liegen in: Puffer[j*UseChannels+i]


   // Daten in Textdatei speichern
   stl:=TStringList.Create;

   // Infos für Textdatei
   stl.Add('Kanalanzahl: '+IntToStr(UseChannels));
   stl.Add('Abtastrate: '+IntToStr(Round(StrToFloat(ListBoxSampleraten.Items[ListBoxSampleraten.ItemIndex]))));
   if CheckBoxDC.Checked then
      stl.Add('DC-Adjust: ja')
   else
      stl.Add('DC-Adjust: nein');
   stl.Add('Messzeit: '+DateTimeToStr(Startzeit));
   stl.Add('Messdauer: '+LabeledEditMesszeit.Text+'ms');
   stl.Add('');
   stl.Add('Kanalimpedanzen');
   stl.AddStrings(ListBoxImpedanzen.Items);
   stl.Add('');

   // Datenüberschrift für TXT Datei
   Zeile:='';
   for i:=0 to UseChannels-1 do
      Zeile:=Zeile+'Kanal '+IntToStr(i+1)+';';
   stl.Add(Zeile);

   // Daten ausgeben
   for j:=0 to AnzahlDaten-1 do
   begin
      Zeile:='';
      for i:=0 to UseChannels-1 do
         Zeile:=Zeile+FloatToStr(Puffer[j*UseChannels+i])+';';
      stl.Add(Zeile);
   end;
   // Text speichern
   stl.SaveToFile(ExtractFilePath(Applicati
[edit=Luckie]Robert hat es dir doch noch extra gesagt, dass du Code-tags verwenden sollst! :roll: Mfg, Luckie[/edit]

mensah 4. Jul 2005 14:09

Re: C++ DLL in delphi einbinden
 
der DLL ist in einfachem C (#define EXPORT_API extern "C" __declspec(dllexport))und nicht C++

Phistev 4. Jul 2005 14:14

Re: C++ DLL in delphi einbinden
 
Kann es sein, dass die Namen anders sind bzw. nicht mitexportiert werden? In dem Fall bräuchte man noch name bzw. index.

JasonDX 4. Jul 2005 14:19

Re: C++ DLL in delphi einbinden
 
Ich schätze, dass StartMessung(Ex) und StopMessung die Funktionen sind, die den Ausgang regeln sollten.
Deshalb würde ich mal vorschlagen, dass du 2 Buttons hinzufügst, die dir temporär die Messung Startet und Stoppen. Dann kannst du schaun, ob es an deinem Code oder an der DLL/Hardware liegt.

Nachdem das aber noch ungeklärt is:
Zitat:

Zitat von mensah
bin gerade in der Bibo wo keine USB-Einkopplung möglich ist

Heißt das, dass die Ausgabe über USB erfolgt? Oder wohin wird die Sinus-Spannung ausgegeben? Wenn die Ausgabe auf Hardware erfolgt, wärs zur Sicherheit auch nicht schlecht, das Messgerät (mit dem du die Sinus-Spannung checkst) zu überprüfen, ob das die Fehlerquelle ist.



@Phistev (In der hoffnung, dass ich dich nicht falsch verstanden habe): Ich glaube nicht, dass es beim Importieren fehlt. Wenn da etwas fehlschlägt, gibts ne schöne AV (afaik zumindest). Und von der wird er uns wohl hoffentlich erzählt haben, wenns tatsächlich eine solche geben sollte ;)

Robert Marquardt 4. Jul 2005 14:21

Re: C++ DLL in delphi einbinden
 
Ich wollte das .h File sehen nicht das konvertierte Delphi-File.
Es ist kein Wunder das es nicht funktioniert. "array of" ist nie eine gueltige Konversion einer C Funktion.

Am besten das .h File direkt an mich schicken. robert_marquardt att gmx dott de

mensah 4. Jul 2005 14:40

Re: C++ DLL in delphi einbinden
 
ich frage meinem Betreuer nach dem C Code.

in der Dokumentation steht:
EXPORT_APIintStartMessungEX(int*pChldx,int chCount){call this function to start data acquistion}

EXPORT-APIintGetBlockValues(float*const pValues)

EXPORT-APIintGetBlockValuesEx(float*const pValues,int numVec) {call this function to get new data values from amplifier}

mensah 4. Jul 2005 14:41

Re: C++ DLL in delphi einbinden
 
Hallo Herr Robert,
ich werde Ihnen eine mail schicken.Danke

Olli 4. Jul 2005 14:46

Re: C++ DLL in delphi einbinden
 
Jetzt bräuchte man noch zum Makro "EXPORT" die Deklaration. Kann bisher alles mögliche von der Aufrufkonvention her sein - usw.

scp 4. Jul 2005 15:30

Re: C++ DLL in delphi einbinden
 
Wie Robert M. schon sagt:
Delphi-Quellcode:
pValues: array of single
dürfte nicht stimmen, könnte eher so aussehen:
Delphi-Quellcode:
pValues: PSingle
mit Inc(Puffer) oder PSingle(Integer(Puffer) + i*AnzahlDaten+j)^ kommst du dann an die weiteren Werte.

NicoDE 4. Jul 2005 18:07

Re: C++ DLL in delphi einbinden
 
Wenn die C-Variante bei __stdcall vor dem Zeiger auf das erste Element den Index des letzten Elements (High) als Integer auf dem Stack ablegt, dann kann man mit 'Offenen Arrays' arbeiten um sich die Arbeit zu erleichtern (sollte man vielleicht als overload in Betracht ziehen)
Delphi-Quellcode:
// 1:1
procedure Foo(A: PInteger; H: Integer); stdcall; overload;
var
  I: Integer;
begin
  for I := 0 to H do
  begin
    ShowMessage(IntToStr(A^));
    Inc(A);
  end;
end;

// open array
procedure Foo(A: array of Integer); stdcall; overload;
var
  I: Integer;
begin
  for I := 0 to High(A) do
    ShowMessage(IntToStr(A[I]));
end;

// test
procedure TForm1.Button1Click(Sender: TObject);
var
  I: Integer;
  A: array [0..3] of Integer;
begin
  // 1:1
  for I := 0 to High(A) do
    A[I] := I;
  Foo(Addr(A[0]), High(A));
  // open array
  Foo([0, 1, 2, 3]);
end;

Robert Marquardt 4. Jul 2005 18:26

Re: C++ DLL in delphi einbinden
 
Das mit dem "array of" ist etwas gefaehrlich und ausserdem ist die uebliche Konvention das die Laenge nach dem C-Array folgt.

Das Zip war korrupt. Haette ich nicht inzwischen DSL waere ich auch noch sauer, denn ich habe nur nach dem .h File gefragt und offensichtlcih ein ganzes Projekt bekommen. Die Unis sind auch nicht mehr was sie mal waren. Frueher konnten die Leute wenigstens lesen.

NicoDE 4. Jul 2005 18:38

Re: C++ DLL in delphi einbinden
 
Zitat:

Zitat von Robert Marquardt
Das mit dem "array of" ist etwas gefaehrlich und ausserdem ist die uebliche Konvention das die Laenge nach dem C-Array folgt.

Stimmt, ich mag halt Sonderfälle ;)
(oder vielleicht liest ein C++-Entwickler mit und lernt dabei Delphi *g*)

Zitat:

Zitat von Robert Marquardt
Frueher konnten die Leute wenigstens lesen.

Früher bekamen Stundenten, welche Urlaubsfotos als 1600x1200 BMP-Anhang an <alle> schickten, noch eine deutliche Verwarnung :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:26 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