Com+ / OLE Zugriff auf Programm Hilfe - komm nicht weiter :-(



  • Nun schon fast ein halbes Jahr versuche ich vergeblich auf die COM-Schnittstelle unseres Buchaltungsprogramms zuzugreifen und schaffe es nicht.

    Daher bitte ich nochmals um eure Hilfe - bin auch bereit was dafür auszugeben wenn mir jemand helfen kann die Anbindung in die Reihe zu bekommen.

    Ich benutze im Moment den C++ Builder Version 6 ( Steige bald auf 2006 um ).
    Das Programm heist BüroPlus und Bietet eine COM-Schnittstelle.

    Ich habe einige Programmierbeispiele für Delphi 5 , WSH und VB.
    Ich habe Snipletts und einige komplette Programme als Quellen.

    Irgend wie muss das doch zu schaffen sein.

    Das ist z.B. das einfachste Beispiel für Delphi 5 :

    var
      BpApp: Variant;
      a,b,c : string;
    begin
      BpApp := CreateOleObject('BpNt.Application');
      BpApp.Init('GetKundendaten','','','');
      showmessage(BpApp.GetVersion);
      BpApp.GetKundendaten(a,b,c);
      showmessage(a + ' ' + b + ' ' + c);
      BpApp := nil;
    end;
    

    Zusätzlich konnte ich über "Projekt/Typenbibliothek.." die *_TLP und *_OCX erstellen. Auserdem wurden Komponenten der Komponentenpalette hinzugefügt.

    Leider waren bisher alle Tests ohne erfolg.

    Ich habe z.B. folgendes getestet :

    //der Originale String
            AnsiString Original = "GetKundendaten";
            AnsiString Original2 = "";
    				//der Puffer
            wchar_t c1[255];
    
     Variant BPNext;
     BPNext = CreateOleObject("BpNt.Application");
     BPNext.Init(Original.WideChar(c1,sizeof(c1)),Original2.WideChar(c1,sizeof(c1)),Original2.WideChar(c1,sizeof(c1)),Original2.WideChar(c1,sizeof(c1)));
     BPNext = Unassigned;
    

    Leider kennt er ja die Funktion "Init" garnicht. Wie macht das Delphi ?

    Bitte helft mir - ich muss das unbedingt hinbekommen 😞
    Mir würde ja schon ein Hinweis reichen um weiter zu machen.
    Aber im Moment gehen mir einfach die Lösungsansätze aus.

    Folgende Quellen konnte ich bisher extrahieren
    http://www.ortleb.de/downloads/BPNext/BpNexT.IDL
    http://www.ortleb.de/downloads/BPNext/BpNT_OCX.cpp
    http://www.ortleb.de/downloads/BPNext/BpNT_OCX.h
    http://www.ortleb.de/downloads/BPNext/BpNT_TLB.cpp
    http://www.ortleb.de/downloads/BPNext/BpNT_TLB.h

    CU
    Torsten



  • du hättest auch deinen damaligen Beitrag wieder nutzen können

    eventuell gehts ja so:

    Variant BPNext1 = BPNext.OleFunction("Init", <die benötigten Variablen>);
    


  • Da der BCB auch Delphi-Dateien (ObjectPascal) versteht, hast du schon mal versucht den Delphi-Code auszuführen?



  • Linnea schrieb:

    Variant BPNext1 = BPNext.OleFunction("Init", <die benötigten Variablen>);
    

    Sry - hab nich dran gedacht den alten Beitrag rauszukramen.

    Die Version oben geht leider nicht, löst einen EOleSysError aus 😞

    Th schrieb:

    Der Builder kann zwar Delphi Objekte ( z.B. CreateOleObject() ) benutzen, aber den gesammten Quelltext versteht er nicht. Das muss umgeschrieben werden, nur wie..



  • ok, da es ne Demo-version von dem Programm gibt, hab ich mal etwas getestet 😉

    Warum verwendest du nicht die durch die Typenbibliothek installierten Komponenten?

    leg ein TApp aufs Formular, dann bei ButtonClick

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    App1->Connect();
    WideString t1 = "GetKundenDaten";
    WideString t2 = "";
    
    App1->Init(t1.c_bstr(),t2.c_bstr(),t2.c_bstr(),t2.c_bstr());
    ShowMessage(App1->GetVersion());
    App1->Disconnect();
    }
    

    die Funktionen die man verwenden kann sind alle in der BpNT_OXC.h enthalten, und zwar für jede Komponente

    ein Problem dürfte sein, daß meist mit WideString/wchar_t gearbeitet wird, d.h. eventuell benötigst du Komponenten die UNICODE darstellen können (z.B. die TNT-Komponenten)

    was ich noch nicht ganz herausbekommen hab ist der Zugriff auf GetKundendaten, da hier u.a. das Problem der UNICODE-Zeichen zutrifft:

    tagVARIANT a,b,c;
    App1->GetKundendaten(&a,&b,&c);
    WideString s1 = a.bstrVal;  //eventuell auch ein anderer Parameter, siehe BCB-Hilfe zu tagVARIANT/TVarData
    WideString s2 = b.bstrVal;
    WideString s3 = c.bstrVal;
    ShowMessage(s1 + "\r\n" + s2 + "\r\n" + s3);
    

    entweder kommt nur Kauderwelsch oder Fehlermeldungen...



  • Das war der entscheidente Hinweiß.

    der Lustige Typ tagVARIANT sollte wohl dynamisch als Zeiger erstellt werden.
    Dann macht der auch was er soll 🙂 (Hab aber vorher noch nie etwas von diesem Typ gehört - und Laut Hersteller sollte das sowiso ein OleVariant sein.

    So geht es auf Jeden Fall :-).

    tagVARIANT *a = new (tagVARIANT);
    tagVARIANT *b = new (tagVARIANT);
    tagVARIANT *c = new (tagVARIANT);
    App1->GetKundendaten(a,b,c);
    WideString s1 = a->bstrVal;  //eventuell auch ein anderer Parameter, siehe BCB-Hilfe zu tagVARIANT/TVarData
    WideString s2 = b->bstrVal;
    WideString s3 = c->bstrVal;
    Label2->Caption = s1 + "\r\n" + s2 + "\r\n" + s3;
    

    Deine Hilfe soll nicht umsonst gewesen sein - ich hätte sonst nicht weiter gewusst.

    Kannst du mich mal unter torsten@ortleb.de anschreiben ? Oder kann ich dich irgendwie Erreichen ?

    CU
    T


Anmelden zum Antworten