![]() |
Delphi-Version: XE
C++ Header nach Delphi // DLL
Hallo :oops:
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 :wink: ). 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 :pale:) und Klassenstrukturen kann es wohl auch nicht.
Code:
Wie sieht das in Delphi aus?
#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; }; 2) Weiter habe ich Schwierigkeiten, die Funktionen der DLL mit korrekten Datenstrukturen zu versorgen. Das in C++
Code:
wurde so auf Delphi übersetzt
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);
Delphi-Quellcode:
und ich versuche so damit zu reden
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};
Delphi-Quellcode:
Was mache ich beim Buf(fer) falsch?
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; 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: ![]() |
AW: C++ Header nach Delphi // DLL
Delphi-Quellcode:
würde schon helfen. Char ist in Delphi seit Delphi 2009 WideChar (2 Byte) die Schnittstelle erwartet aber Ansichar
Buf:Array[1..100] of AnsiChar;
|
AW: C++ Header nach Delphi // DLL
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. |
AW: C++ Header nach Delphi // DLL
Oh...
ihr habt beide Recht :thumb:
Delphi-Quellcode:
So gehts! Mein Wochenende ist gerettet!
var Cmd:Ansistring;
Buf:Array[1..100] of AnsiChar; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:12 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