Einzelnen Beitrag anzeigen

SearchBot

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

C++ Header nach Delphi // DLL

  Alt 6. Mai 2016, 14: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