AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

C++ Header nach Delphi // DLL

Ein Thema von SearchBot · begonnen am 6. Mai 2016 · letzter Beitrag vom 6. Mai 2016
Antwort Antwort
SearchBot

Registriert seit: 27. Jun 2004
Ort: N-W vom Bodensee
209 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

C++ Header nach Delphi // DLL

  Alt 6. Mai 2016, 13:55
Delphi-Version: XE
Hallo

ich habe da ein (sicher) kleines Problem mit der Übersetzung von C++ Quelltext nach Delphi und eines beim Anwenden von Datenstrukturen.

Ich habe ein Messgerät, das über USB angeschlossen wird. Die Treiber sind installiert.

1)
Der mitgelieferte Bespielcode ist für C#, C++ und LabView. Ich verstehe diese Sprachen aber so gut wie Japanisch (das kann ich ein wenig ). Ich weiß also in etwa, was der Code macht, aber ich bin nicht schlau genug, um ihn in sauberes Delphi zu schreiben und der HEADConv macht etwas daraus, das sich nicht complilieren lässt, zB wird <vector> nicht übersetzt und ich weiß nicht, was das ist (klar: google mal... - und trotzdem ) und Klassenstrukturen kann es wohl auch nicht.

Code:
#pragma once
#include <vector>

using namespace std;

// This structure contains the information for a single device.
typedef struct tagDevInfo
{
   int nID;
   CString cstrDescription;
}
DevInfo;


// This class interfaces with UsbDll.dll and provides the basic
// functionality for USB communication.
class USB
{
public:
   USB (void);
   ~USB (void);

   bool OpenDevices (int nProductID = 0);
   void CloseDevices ();
   int Read (int nDeviceID, char* lpBuffer, int nLength, unsigned long* lBytesRead);
   int ReadBinary (int nDeviceID, char* lpBuffer, int nLength, unsigned long* lBytesRead);
   int Write (int nDeviceID, char* lpBuffer);
   vector<DevInfo> GetDevInfoList ();
   void FillDevInfoList (char* lpDevInfo);

private:
   // The device information list.
   vector<DevInfo> m_DevInfoList;
   // The device information list copy to be returned to the class user.
   vector<DevInfo> m_DevInfoListCopy;
   // The devices open flag.
   bool m_bOpen;
};
Wie sieht das in Delphi aus?

2)
Weiter habe ich Schwierigkeiten, die Funktionen der DLL mit korrekten Datenstrukturen zu versorgen.

Das in C++
Code:
long EXPORT newp_usb_send_ascii (long DeviceID, char* Command, unsigned long Length);
long EXPORT newp_usb_get_ascii (long DeviceID, char* Buffer, unsigned long Length, unsigned long* BytesRead);
wurde so auf Delphi übersetzt
Delphi-Quellcode:
var
  newp_usb_send_ascii: function(DeviceID: LongInt;
                                Command: PChar;
                                Length: LongInt): LongInt {$IFDEF WIN32} stdcall {$ENDIF};
var
  newp_usb_get_ascii: function(DeviceID: LongInt;
                               Buffer: PChar;
                               Length: LongInt;
                               var BytesRead: LongInt): LongInt {$IFDEF WIN32} stdcall {$ENDIF};
und ich versuche so damit zu reden
Delphi-Quellcode:
var Cmd:string;
    Buf:Array[1..100] of Char;
    len,red,i,id:integer;

begin
 if USBonline then begin //Das Öffnen des Gerätes über VendorID und ProductID funktioniert
   Cmd:='*IDN?'#13;
   id:=1; //hab ja nur 1 Gerät; Bereich integer 1..31 zulässig - oder es soll eine andere "DeviceID" sein?!
          //nur bei "1" gibt das Gerät eine Reaktion ab.

    newp_usb_send_ascii(id,PChar(Cmd),length(Cmd));

    newp_usb_get_ascii(id,@buf,length(buf),red);

   cmd:='';
   for i := 1 to red do
     cmd:=cmd+Buf[i];
   if red>0 then Memo1.Lines.Add(format('%d: "%s"',[red,cmd])) else Memo1.Lines.Add('Fehler');;
 end;
Was mache ich beim Buf(fer) falsch?
Ich kann also schon die Verbindung zum Gerät öffnen (auch ohne die USB-Klasse), nur die Kommunikation gelingt mir nicht - das Gerät piept nach senden des Kommandos, aber es scheint es nicht verstanden zu haben. Ich vermute, daß ich die Datenstruktur falsch habe und so nur Müll beim Gerät ankommt?!

Kompletten Quelltext kann man da ansehen:
ftp://download.newport.com/Photonics...PlusPlusSample
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
636 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#2

AW: C++ Header nach Delphi // DLL

  Alt 6. Mai 2016, 14:01
Buf:Array[1..100] of AnsiChar; würde schon helfen. Char ist in Delphi seit Delphi 2009 WideChar (2 Byte) die Schnittstelle erwartet aber Ansichar
Fritz Westermann
  Mit Zitat antworten Zitat
Mikkey

Registriert seit: 5. Aug 2013
265 Beiträge
 
#3

AW: C++ Header nach Delphi // DLL

  Alt 6. Mai 2016, 14:11
Den Beispielcode kannst Du vergessen, bei dem kannst Du nur untersuchen, was der macht und ihn analog in Delphi nachbauen. CString kannst Du als String umsetzen, "Vector" entspricht in etwa einem dynamischen Delphi-Array.

Beim Buffer darfst Du nicht einfach einen String auf PChar casten. Es gibt dafür geeignete Funktionen. Das Gegenstück ist auch eher AnsiString.

Mir steht kein Delphi mehr zur Verfügung, so dass ich bei den Namen aufs Raten angewiesen bin.
  Mit Zitat antworten Zitat
SearchBot

Registriert seit: 27. Jun 2004
Ort: N-W vom Bodensee
209 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: C++ Header nach Delphi // DLL

  Alt 6. Mai 2016, 17:24
Oh...

ihr habt beide Recht

Delphi-Quellcode:
var Cmd:Ansistring;
    Buf:Array[1..100] of AnsiChar;
So gehts! Mein Wochenende ist gerettet!
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 09:09 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf