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