AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

dll einbinden / Pointer Probleme

Ein Thema von Pow3rus3r · begonnen am 17. Apr 2012 · letzter Beitrag vom 25. Apr 2012
Antwort Antwort
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.374 Beiträge
 
Delphi 12 Athens
 
#1

AW: dll einbinden / Pointer Probleme

  Alt 17. Apr 2012, 14:09
COM_Handle wird doch bestimmt ein VAR-parameter sein. (vermutlich auch eher HANDLE/THandle, anstatt Pointer)

Und wie ist das Result deklariert? (im C-Code ist nix zu sehn)

Wie sieht die Aufrufkonvention aus? (sicher daß es stdcall ist)

Und welche Delphi-Version nutzt du?
PChar ist aber so oder so keine sonderlich guter Idee. Ich würde vermuten, daß wohl eher PAnsiChar gemeint ist.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Pow3rus3r

Registriert seit: 17. Apr 2012
43 Beiträge
 
Delphi XE Professional
 
#2

AW: dll einbinden / Pointer Probleme

  Alt 17. Apr 2012, 14:32
@DeddyH: Danke! Leider funktioniert es so auch nicht - ich hatte es auch schon mit THandle statt Pointer probiert - ohne Erfolg.

@himitsu: Mit THandle hatte ich es Anfangs auch probiert - leider brachte das aber kein Erfolg. In der DLL Doku steht folgendes:
"COM_TcpOpen erwartet als handle-Parameter eine Variable vom Typ COM_Handle (z.B. COM_Handle m_hCom. Diese Variable ist ein Zeiger auf das von der Funktion COM_TcpOpen erzeugte (Ethernet) Interface. Sprich dieser Pointer wird von COM_TcpOpen erst initialisiert(referenziert)."

Deshalb die Idee, ein unreferenziertes Handle zu übergeben - aber anscheinend habe ich da etwas übersehen, denn es passiert nichts.

Als Result ist folgendes deiniert:
Code:
Returns:
COM_RETURN_OK Function executed successfully.
COM_RETURN_Failed The function failed to create a new handle.
Die Aufrufkonvention ist mir gänzlich unbekannt, da keinerlei Dokumentation für diese DLL mit Delphi existieren (und genau das ist mein Problem - denn ich tappe da ziemlich im dunkeln).

Ob PChar so passt, ist auch fragwürdig. Ich habe nur die Information, dass für ipaddress ein nullteminierter String (const char* in c++) erwartet wird. Für Port wird ein unsigned short int erwartet.

Ich benutze Delphi XE (15.0.xxx)
  Mit Zitat antworten Zitat
Benutzerbild von Assarbad
Assarbad

Registriert seit: 8. Okt 2010
Ort: Frankfurt am Main
1.234 Beiträge
 
#3

AW: dll einbinden / Pointer Probleme

  Alt 17. Apr 2012, 15:08
Würdest du uns bitte den kompletten Prototypen der Funktion in C/C++ geben, sowie den typedef für COM_Handle?

Ggf. laß lieber ein paar Zeilen rundherum mit dabei anstatt zuviel herauszuschnipseln. Ach ja, ein Link zu dem Header würde auch helfen wenn der alternativ vorhanden ist.

Wenn du nur die DLL hast, wird das etwas schwieriger. Man bräuchte mindestens die DLL (klar) um mal in IDA nachzugucken, aber ne Garantie auf ein schnelles Resultat ist das nicht. Kann sein, kann aber auch nicht sein. Wenn du ein Programm hast welches diese DLL benutzt ist es auch sinnvoll dieses beizulegen. Kann man es irgendwo runterladen, gib halt den Link
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.374 Beiträge
 
Delphi 12 Athens
 
#4

AW: dll einbinden / Pointer Probleme

  Alt 17. Apr 2012, 15:25
SHORT in C ist doch in Delphi ein Word/SmallInt? (ShortInt/Byte währe für einen Port eh zu klein)

Und ansonsten hat Assarbad ja noch genügend gesagt.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Assarbad
Assarbad

Registriert seit: 8. Okt 2010
Ort: Frankfurt am Main
1.234 Beiträge
 
#5

AW: dll einbinden / Pointer Probleme

  Alt 17. Apr 2012, 15:44
SHORT in C ist doch in Delphi ein Word/SmallInt?
Jenau. Wobei ich bei SmallInt und ShortInt in Delphi auch immer durcheinander komme, seit ich hauptsächlich nativ mit C/C++ arbeite.
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.487 Beiträge
 
Delphi 12 Athens
 
#6

AW: dll einbinden / Pointer Probleme

  Alt 17. Apr 2012, 16:14
Als Result ist folgendes deiniert:
Code:
Returns:
COM_RETURN_OK Function executed successfully.
COM_RETURN_Failed The function failed to create a new handle.
Das schaut mehr nach einem Integer-Result aus.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.374 Beiträge
 
Delphi 12 Athens
 
#7

AW: dll einbinden / Pointer Probleme

  Alt 17. Apr 2012, 18:25
Und wo steht dort was von einem String/PChar?
Sieht eher nach einem HRESULT/Cardinal aus.
Aber irgendwo wird ja COM_RETURN_OK ja deklariert sein.

Und Integer = SmallInt.

Wie sieht denn die genaue Fehlermeldung aus?
Strg+C im Fehlerdialog drücken und dann Strg+V im Beitrageditor.

Als Result ist folgendes deiniert:
Code:
Returns:
COM_RETURN_OK Function executed successfully.
COM_RETURN_Failed The function failed to create a new handle.
Falsch, das ist die Beschreibung der möglichen Rückgabewerte.
Es wurde aber absichtlich nach der vollständigen Deklaration gefragt.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Assarbad
Assarbad

Registriert seit: 8. Okt 2010
Ort: Frankfurt am Main
1.234 Beiträge
 
#8

AW: dll einbinden / Pointer Probleme

  Alt 17. Apr 2012, 18:32
Und wo steht dort was von einem String/PChar?
Sieht eher nach einem HRESULT/Cardinal aus.
Aber irgendwo wird ja COM_RETURN_OK ja deklariert sein.
Außer bei der Originalvariante (als Delphi-Referenz durchsuchenstring) und bei DeddyH's Versuch steht da nix von Delphi-Referenz durchsuchenPChar. In der C-Variante fehlen Linkage, Aufrufkonvention und Rückgabewert komplett.

Meine Glaskugel hat auch Urlaub.

Ist das evtl. nur ein Wrapper für TCP/IP?
Ich hab schon erlebt, dass manche versuchen eine DLL für die serielle Schnittstelle anzusteuern, obwohl man mit einer Delphi Komponente viel besser dran wäre.
Die Befürchtung halte ich für sehr berechtigt.
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)

Geändert von Assarbad (17. Apr 2012 um 18:35 Uhr)
  Mit Zitat antworten Zitat
Pow3rus3r

Registriert seit: 17. Apr 2012
43 Beiträge
 
Delphi XE Professional
 
#9

AW: dll einbinden / Pointer Probleme

  Alt 18. Apr 2012, 10:06
Wow, danke für die Beteiligung!

Konkret geht es um folgendes: Ich habe eine Hardware, die über Ethernet angesteuert werden soll. Der Hardwarehersteller hat dazu eine dll zur Verfügung gestellt, welche die Funktionen für Kommunikationsaufbau, Abbau und Datenübertragung enthält. Ich versuche nun eine Kommunikation mit dem Steuergerät herzustellen (Funktion COM_TcpOpen in der DLL). Die Funktion ist in der Onlinehilfe des Hardwareherstellers wie folgt dokumentiert:
Code:
EXPORTDLL COM_RETURN EBEL_API COM_TcpOpen ( COM_Handle *  handle,
  const char *  ipAddress,
  u16  port
 )  

Generates a new PC HW interface. To communicate with a hardware over Ethernet.

Parameters:
handle = Pointer to a handle representing the interface instance. Will be filled by this function.
ipAddress = IP Address of the target.
port = Port number used to communicate with the target.

Returns:
COM_RETURN_OK Function executed successfully.
COM_RETURN_Failed The function failed to create a new handle.
Hier die Codeausschnitte aus dem c++ Beispielprogramm vom Hardwarehersteller:
Typedef:
Code:
/// \brief Defines a handle to a PC->Hardware communication object.
typedef void* COM_Handle;
COM_Return Definition:
Code:
/// \brief Return values used by the interface functions. This type provides information about an error. A zero value means no error occured.
typedef enum COM_RETURNtag
{
    COM_RETURN_OK = 0,               ///< Function executed successfully.
    COM_RETURN_Failed,               ///< Function execution failed.
    COM_RETURN_InvalidHandle,         ///< The handle parameter was NULL or not a matching PC HW interface handle.
    COM_RETURN_InvalidParameter,      ///< One of the parameter was invalid.
    COM_RETURN_NullPointer,            ///< One of the paramter was a NULL pointer but should point to a stucture or variable.
    COM_RETURN_Timeout,               ///< The hardware was not responding or not reachable.
    COM_RETURN_NotSupported,         ///< The command requested was not supported by the application on the hardware.
    COM_RETURN_AlreadyRunning,         ///< The function / application is already running.
    COM_RETURN_Locked               ///< The function can not be executed while the HW/SW/region is locked.
} COM_RETURN;
COM_TcpOpen Aufruf in C++:
Code:
//---------------------------------------------------------------------------
// Example of an implementation of a COM_TcpOpen call
//---------------------------------------------------------------------------

void CHwComTestGuiDlg::OnBnClickedOpentcp()
{
    CString str;

    UpdateData();   // Update the member variables with the values in the text fields.
#ifdef BLUETOOTH_INTERFACE
    //Disable bluetooth "Open" and "Close" buttons
    CButton *tcpBTHOpenClose;
    tcpBTHOpenClose = (CButton*) GetDlgItem(IDC_CBUTTON_OPEN);
    tcpBTHOpenClose->EnableWindow(FALSE);
    tcpBTHOpenClose = (CButton*) GetDlgItem(IDC_CBUTTON_CLOSE);
    tcpBTHOpenClose->EnableWindow(FALSE);
#endif   
    COM_RETURN ret = COM_TcpOpen(&m_hCom,m_ipAddress.GetBuffer(),m_nPort);      // Call the function
    PrintErrorInfos("COM_TcpOpen",ret);         // Visualize the result
}
Der komplette C++ Quellcode ist wohl leider zu groß, um ihn hier zu posten. Falls aber noch weitere Infos nötig sind, poste ich diese gerne.

Der Entwickler der dll hat mir eben noch geschrieben, dass er sich mit Delphi leider nicht auskennt, aber er davon ausgeht, dass ich vergessen habe, die Zeigeradresse beim Funktionsaufruf mit anzugeben. Nun bin ich aber leider selber nicht der Delphi-Pro und wüsste auf Anhieb auch nicht, ob und wie ich die Adresse übergeben kann.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.374 Beiträge
 
Delphi 12 Athens
 
#10

AW: dll einbinden / Pointer Probleme

  Alt 18. Apr 2012, 10:43
In Delphi sind ENUM standardmäßig so klein wie möglich.

In C sind sie standardmäßig (glaub ich) so groß wie ein Register.
(früher Integer, aber weil irgendein Arsch meinte Integer/Cardinal einfriehren zu müssen NativeInt/NativeUInt)


Also COM_Return entweder als NativeUInt
oder als ENUM, aber mit MinimumEnumSize = RegisterSize.

Die Strings als AnsiString/AnsiChar/PAnsiChar.

COM_Handle als var COM_Handle: THandle; .

Tipp: Das iparray als AnsiString ... läßt sich dann leichter verwenden.


Und siehst du ... gleich alle wichtigen Infos rausrücken und schon geht es schneller.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (18. Apr 2012 um 10:48 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 00:10 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