Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   C++ Programm nach Delphi übersetzen (https://www.delphipraxis.net/152916-c-programm-nach-delphi-uebersetzen.html)

100nF 12. Jul 2010 20:20

C++ Programm nach Delphi übersetzen
 
Hallo zusammen,

Ich habe folgendes Problem:
Für eine CNC-Maschine benutze ich das Steuerprogramm Mach3, welches die Maschine direkt über die Druckerschnittstelle ansteuert.

Nun möchte ich aber dieses Programm über ein eigenes Programm sozusagen fernsteuern. Dazu gibt es auch ein Beispielprogramm auf der Webseite von Mach3, welches ich C++ geschrieben ist. Aus diversen Gründen will ich aber lieber ein Programm in Delphi schreiben, nur habe ich keine Ahnung wie ich mit Mach3 kommunizieren kann.

Hier kann man das Beispielprogramm herunterladen (Kann mit VisualStudio kompiliert werden):
http://www.machsupport.com/downloads/MachRemote.zip

Ich habe lange probiert herauszufinden wie das Beispielprogramm mit Mach3 kommuniziert, schliesslich hatte ich das Gefühl, dass es mit dem Befehl InvokeHelper(....) geschieht, doch in dessen Parameter ist kein Handle von Mach3 zu finden, was mich etwas verwirrt.

Ich wäre wirklich sehr dankbar wenn irgendjemand mal das Beispielprogramm anschauen könnte und mir einen Tipp geben kann wie bzw. ob ich das selbe auch mit Delphi machen kann.

P.S. Google spuckt erstaunlich wenig über den Befehl InvokeHelper() aus, weshalb ich immernoch nicht verstehe was dieser Befehl genau macht.

freundliche Grüsse
urbanbruhin

mkinzler 12. Jul 2010 20:28

AW: C++ Programm nach Delphi übersetzen
 
Hast du die tlb?

100nF 12. Jul 2010 20:48

AW: C++ Programm nach Delphi übersetzen
 
ööhm was soll denn das sein? :?

Ich hab eigentlich nicht mehr, als das was es auf der angegebenen Homepage zum herunterladen gibt.

100nF 16. Jul 2010 17:53

AW: C++ Programm nach Delphi übersetzen
 
*push*

kann mir denn keiner helfen :cry:

100nF 27. Jul 2010 15:15

AW: C++ Programm nach Delphi übersetzen
 
Also ich hab mich nochmal bemüht soviel rauszufinden wie ich nur kann.

Hier die vermutlich wichtigsten Codeschnipsel aus dem Beispielprogramm (C++):
Code:
class CMach4 : public COleDispatchDriver
{
public:
   CMach4(){} // Calls COleDispatchDriver default constructor
   CMach4(LPDISPATCH pDispatch) : COleDispatchDriver(pDispatch) {}
   CMach4(const CMach4& dispatchSrc) : COleDispatchDriver(dispatchSrc) {}
   // Attributes
public:
   // Operations
public:
   // IMach4 methods
public:
   void LoadGCodeFile(LPCTSTR FileName)
   {
      static BYTE parms[] = VTS_BSTR ;
      InvokeHelper(0x1, DISPATCH_METHOD, VT_EMPTY, NULL, parms, FileName);
   }

   void CloseFile()
   {
      InvokeHelper(0x2, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
   }

   LPDISPATCH GetScriptDispatch()
   {
      LPDISPATCH result;
      InvokeHelper(0x3, DISPATCH_METHOD, VT_DISPATCH, (void*)&result, NULL);
      return result;
   }

   void ShutDown()
   {
      InvokeHelper(0x4, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
   }

   // IMach4 properties

public:
};
Die Funktion Shutdown() ist z.B. verantwortlich dafür, dass das Programm Mach3.exe (welches ich mit Delphi ansprechen will) sich selber beendet. Hier sieht man nun auch, dass die ganze Kommunikation irgendwie per "COleDispatch" oder so ähnlich funktioniert. Nur habe ich davon leider Null Ahnung.
Per InvokeHelper() wird dann ja schlussendlich einen Befehl an Mach3.exe gesendet. Genau dies möchte ich nun mit einem Delphi-Programm auch tun.

Dann habe ich noch ein Codeschnipsel gefunden, welcher für das Connecten und Disconnecten verantwortlich ist:
Code:
void CMachRemoteDlg::OnBnClickedConnect()
{
   LPUNKNOWN lpUnk;
   LPDISPATCH lpDispatch;
   COleException e;
   HRESULT res;

   if (CLSIDFromProgID(OLESTR("Mach4.Document"), &clsid) != NOERROR)
   {
      return;
   }

    if (res = GetActiveObject( clsid, NULL, &lpUnk) == NOERROR)
   {
      HRESULT hr = lpUnk->QueryInterface(IID_IDispatch,
         (LPVOID*)&lpDispatch);
      lpUnk->Release();

      if (hr == NOERROR)
      {
         mach4.AttachDispatch(lpDispatch, TRUE);
         lpDispatch = mach4.GetScriptDispatch();
         scripter.AttachDispatch(lpDispatch, TRUE);
      }

           connected = true;
           m_Status = "Connected to Mach3.";
      UpdateData(false);
      SetTimer( 1, 200, NULL );
      return ;
   }

   m_Status = "No Connection to Mach3.";
   UpdateData(false);
}

//this disconnects from Mach3.
void CMachRemoteDlg::OnBnClickedDisconnect()
{
   scripter.DetachDispatch(); //detach the scripter object
        mach4.ShutDown(); //then shutdown MAch3's interface..    <---- Hier das oben genannte ShutDown()
   m_Status = "No Connection to Mach3.";
   connected = false;
}
Es wird also irgendwie mit "Mach4.Document" verbunden wenn ich das richtig verstehe (?).

Brauche ich nun noch mehr Informationen, damit ich erfolgreich mit Mach3.exe kommunizieren kann, oder ist in den beiden Codeschnipsel alles enthalten was ich brauche?

Wie muss ich nun genau vorgehen?

Für Antworten wäre ich extrem dankbar.

mfg


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:03 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz