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.hCU
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