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