Problem mit GetActiveOleObject

Antworten
ErnstVolker
Beiträge: 336
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Problem mit GetActiveOleObject

Beitrag von ErnstVolker »

Hallo zusammen,
ich habe aus einer Typbibliothek mit Delphi eine Unit erzeugt (DesignCAD_TLB.pas) und diese von Lazarus wiederum übersetzten lassen. Das hat auch soweit gefunzt...

Jetzt wollte ich folgendes ausprobieren...

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
begin
  try
     DcApp := GetOleObject('DesignCAD_TLB.Application') as IDcadApp;
  except
     ShowMessage('Erst DesignCAD starten...');
     Close();
  end;
end;


...aber der Compiler hat ein Problem mit GetActiveOleObject.
Unter uses habe ich OleServer eingefügt, klappt aber nicht.

Hat jemand eine Idee?

Danke
Gruß
Volker

_X_
Beiträge: 250
Registriert: Di 16. Dez 2008, 20:13
OS, Lazarus, FPC: aptosid (aptosid.com); Lazarus SVN gtk2+qt4; FPC 2.4.0
CPU-Target: 32/64Bit

Re: Problem mit GetActiveOleObject

Beitrag von _X_ »

Welcher Fehler kommt denn? Kannst ihn aus dem Nachrichten Fenster von Lazarus raus kopieren.
Ohne den Fehler, der vom FPC ausgeworfen wird können wir dir nicht helfen!

mfg _X_

ErnstVolker
Beiträge: 336
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Problem mit GetActiveOleObject

Beitrag von ErnstVolker »

Hallo,

Das sind die Meldungen aus dem Nachrichtenfenster:

unit1.pas(43,33) Error: Identifier not found "GetActiveOleObject"
unit1.pas(92) Fatal: There were 1 errors compiling module, stopping

Gruß

Volker

_X_
Beiträge: 250
Registriert: Di 16. Dez 2008, 20:13
OS, Lazarus, FPC: aptosid (aptosid.com); Lazarus SVN gtk2+qt4; FPC 2.4.0
CPU-Target: 32/64Bit

Re: Problem mit GetActiveOleObject

Beitrag von _X_ »

Er findet die Funktion nicht, GetActiveOleObject müsste in der Unit "ComObj" drinn sein.

mfg _X_

ErnstVolker
Beiträge: 336
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Problem mit GetActiveOleObject

Beitrag von ErnstVolker »

Hallo _X_

ComObj eingefügt, schon funzt das Compilieren. Vielen Dank _X_!!!

Jetzt steckt allerdings noch ein Fehler im Programm,
es arbeitet nicht wie gewünscht. Die try-exception Anweisung führt immer dazu, daß ShowMessage ausgeführt wird, auch wenn DesignCAD geöffnet ist.
Dann folgt ein Meldefenster mit "Access violation"
Dem muß ich erst noch nachgehen. Aber heute nicht mehr.

Gruß und Danke
Volker

_X_
Beiträge: 250
Registriert: Di 16. Dez 2008, 20:13
OS, Lazarus, FPC: aptosid (aptosid.com); Lazarus SVN gtk2+qt4; FPC 2.4.0
CPU-Target: 32/64Bit

Re: Problem mit GetActiveOleObject

Beitrag von _X_ »

Wenn mich nicht alles täuscht muss es so aussehen:

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
begin
  try
     DcApp := GetOleObject('DesignCAD_TLB.Application') as IDcadApp;
  except
     on e: Exception do begin
       ShowMessage('Erst DesignCAD starten...');
       Close();
     end;
  end;
end;

mfg _X_

hotzenplotz
Beiträge: 33
Registriert: So 13. Dez 2009, 16:17

Re: Problem mit GetActiveOleObject

Beitrag von hotzenplotz »

Access violation! - Zugiffsverletzung - Putzig! Ich kenne das Problem. Ich steuere mehr oder weniger TurboCAD mit Lazarus. Vieles funktioniert, andere Dinge müssen ausgetestet werden bzw. umgeschrieben werden. Ich erinnere mich da an ein Problem dass ich noch immer habe mit einem OleVariant!

Evt. hilft dir das was auf meinen Seiten zu Lazarus mit TurboCAD steht. http://www.dannerbeck.com

Welchen Compiler benutzt du?
Du solltest minimum 2.4.x haben! Sonst kannst du es eigentlich vergessen.

EDIT: Das Thema sollte auch in das Windows Forum verschoben werden...
Mischen Sie Sich ein! Machen Sie mit! ödp www.ödp.de - Die Öko-Demokraten

ErnstVolker
Beiträge: 336
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Problem mit GetActiveOleObject

Beitrag von ErnstVolker »

Hallo _X_

ich hab' Deine Lösung für try-except probiert, funktioniert aber nicht. Es wird immer das Message-Fenster angezeigt und anschließend das Form getartet.
Egal ob DC offen ist oder nicht. Anschließend dann die Zugriffsverletzung, wenn der Zeichnen-Befehl ausgeführt werden soll.

@hotzenplotz:
Wie ich auf Deiner Seite sehe beschäftigst Du Dich mit TurboCad. Was den Compiler angeht hab' ich wohl noch 2-2-4 am laufen. Der, welcher in der LazarusIDE v0.928.2Beta vorhanden ist.

Ich denke das Problem liegt in der Umgebauten Delphi-Unit. Wenn ich über den ProjectInspector diese Unit dem Project hinzufüge dann geht gar nix. Dann gibt es in der lpr-Datei, also im eigentlichen Programm Probleme mit den Befehlen Application.Initialize, Application.Run usw. weil Application natürlich auch in der Unit vorkommt. Ich kann die Unit DesignCAD_TLB.pas also nur über uses einbinden.

Mit Delphi7 klapp es wunderbar, sogar besser als mit VB.Net. Bei Delphi7 kann ich aus der Unit sogar ein Package erstellen. Die dll für VB.Net, mit TlbImp.exe aus dem .Net SDK erzeugt arbeitet auch nicht so ganz sauber. Hier klappt zwar der Zugriff auf eine geöffnetes DC-Programm, aber nicht der "Fremdstart des Programmes. Diesen brauche ich aber auch nicht. Das Makro soll ja erst anspringen wenn schon eine Zeichnung besteht, in die dann "reingemalt" wird.

Ich muß nochmal weiter tüfteln und auch mal den Compiler wechseln. Ich weis nur nicht wie das geht.

Gruß und Danke an Euch

Volker

marcov
Beiträge: 1100
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: Problem mit GetActiveOleObject

Beitrag von marcov »

Fuer COM mindestens 2.4.0, aber besser -trunk (2.5.1 von nach letzem Wochenende).

Aber (COM originieertes) Exception Handling ist noch immer schwierig. FPC unterstützt kein SEH.

hotzenplotz
Beiträge: 33
Registriert: So 13. Dez 2009, 16:17

Re: Problem mit GetActiveOleObject

Beitrag von hotzenplotz »

ErnstVolker hat geschrieben:Ich muß nochmal weiter tüfteln und auch mal den Compiler wechseln. Ich weis nur nicht wie das geht.
Volker


Am leichtesten funktioniert es, wenn du dir eine Lazarus Version mit dem FPC zulegst. Hab ich beschrieben auf meiner Seite!
http://dannerbeck.com/?p=11 <-Die einfache Methode.
Oder eben ausm Trunk. Das ist ein bischen tricky. Ich habe angefangen das auch zu beschreiben. Das muss ich allerdings erst noch fertigstellen.

Bist du dir sicher, dass

Code: Alles auswählen

DcApp := GetOleObject('DesignCAD_TLB.Application') as IDcadApp;

IDcadApp existiert? Ich gehe davon aus, dass das SDK mit TurboCAD ziemlich gleich ist, ohne dies zu wissen! Aber es ist naheliegend, da ja offenbar beide Programme von
IMSIG Design sind...
Bei mir heisst das folgendermasen:

Code: Alles auswählen

TCApp:= GetActiveOleObject('TurboCAD.Application') as IApplication;

Bist du dir sicher, das es kein Interface namens IApplication bei dir gibt? :D Und...
DesignCAD_TLB.Application schaut auch aus, als wäre hier etwas faul! Und...
Versuch mal GetActiveOleObject...

Am besten, du besorgst dir mal den OLEViewer und checkst die DLL. http://www.microsoft.com/downloads/deta ... laylang=en
Mischen Sie Sich ein! Machen Sie mit! ödp www.ödp.de - Die Öko-Demokraten

ErnstVolker
Beiträge: 336
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Problem mit GetActiveOleObject

Beitrag von ErnstVolker »

Hallo hotzenplotz,

Deine Seite ist interessant. Den OleViewer hab' ich mir besorgt und die zugehörige viewer-DLL auch.
Lazarus und FPC hab' ich auf eineren neueren Stand gebracht. Da gibt es auch nicht mehr die Debuggermeldung daß dieser abgestürzt sei.
Das Beispiel ist aus dem Entwicklerhandbuch. Aber Du hast Recht, es muß:

DcApp:= GetActiveOleObject('DesignCAD_TLB.Application') as IDcadApp; heißen.

Nur die Fehlermeldungen bleiben.

Ich hab' das dann mal mit diesem Befehl unter Delphi7 probiert und es geht auch nicht.
Mit Delphi funzt es nur, wenn ich das Package zur Hilfe nehme, welches aus DesignCAD_TLB.pas erzeugt wurde. Hier habe ich in der Leiste oben einen "Reiter mit DC-Icon ". Wenn ich das Icon auf die Form setze, kann ich im Objectinspector die Eigenschaften AutoConnect auf True und ConnectKind auf RunningInstance setzen. Dann benötige ich "GetActiveOleObject" nicht. Das wird dann vermutlich irgendwo anders her geholt, nur wo?
Wobei, wenn ich "zu Fuß" arbeite und "DcApp:= DesignCAD_TLB.Application.create;" nutze, dann wird DesignCAD gestartet, kein Problem. Das wiederum funzt unter VB.Net nicht. Unter VB.Net klappt es aber mit dem Zugriff auf die bestehende DC-Sitzung.

Das Package von Delphi habe ich versucht nach Lazarus zu portieren, aber ich bekomme keinen "Reiter mit Icon". Er kommentiert auch die StdVCL aus. Irgendwo hier im Forum las ich, daß man die nicht braucht...

Vielen Dank nochmal für die Tipps

Gruß

Volker

hotzenplotz
Beiträge: 33
Registriert: So 13. Dez 2009, 16:17

Re: Problem mit GetActiveOleObject

Beitrag von hotzenplotz »

ErnstVolker hat geschrieben:Hallo hotzenplotz,
.......
Das Beispiel ist aus dem Entwicklerhandbuch. Aber Du hast Recht, es muß:

DcApp:= GetActiveOleObject('DesignCAD_TLB.Application') as IDcadApp; heißen.

Nur die Fehlermeldungen bleiben.

Ich hab' das dann mal mit diesem Befehl unter Delphi7 probiert und es geht auch nicht.
......
Das Package von Delphi habe ich versucht nach Lazarus zu portieren, aber ich bekomme keinen "Reiter mit Icon". Er kommentiert auch die StdVCL aus. Irgendwo hier im Forum las ich, daß man die nicht braucht...
Volker


Code: Alles auswählen

DcApp:= GetActiveOleObject('DesignCAD_TLB.Application') as IDcadApp;


Das _TLB in den Klammern kommt mir seltsam vor! Sollte das nicht

Code: Alles auswählen

DcApp:= GetActiveOleObject('DesignCAD.Application') as IDcadApp;

sein? Versuch das mal!
Ja. Die StdVCL brauchst du nicht. Hast du von Delphi einen Wrapper generieren lassen? Ein Package in Lazarus brauchst du auch nicht generieren! Es genügt die xxx_tlb.pas also der Wrapper bzw. die TLB eben ;) Mehr brauchst du auch nicht. Dann muss du noch das OleObject bekommen und kannst dann mit dem early binding (mit hilfe der xxx_TLB.pas möglich) auf den kompletten Funktionsumfang der COM DLL zugreifen. Das würde auch OHNE der Wrapper Datei funktionieren! Dann hast allerdings keine Intellisense und keine Fehlerkontrolle.

Post doch mal deine 2 Dateien auf Pastebin oder so. Also den Wrapper bzw. die xxx_TLB.pas und deine Unit. Dann kann man dir denke ich besser helfen.
Mischen Sie Sich ein! Machen Sie mit! ödp www.ödp.de - Die Öko-Demokraten

ErnstVolker
Beiträge: 336
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Problem mit GetActiveOleObject

Beitrag von ErnstVolker »

Hallo Hotzenplotz,

entschuldige den späten Dank, aber ich habe momentan nur sporadisch Netz zur Verfügung und sitze wenig vor meinem eigenen Rechner. Gerade mal heute.
Aber 1.000 Dank!!!!!
Du hattest Recht!!!!
So DcApp:= GetActiveOleObject('DesignCAD.Application') as IDcadApp; gehts!!!!!
Ich verstrahlter Trottel hab' mich die ganze Zeit an's Entwicklerhandbuch von DesignCAD gehalten. Da steht es nämlich mit DesignCAD_TLB.Application drinnen.
Die Unit heisst ja auch so, und die globale Variable DcApp wurde auch entsprechend erzeugt: DcApp:=DesignCAD_TLB.Application
Und es Compiliert noch mit dem 2-2-4-Compiler.

Du schreibst in Deinem letzten Absatz, es genüge der Wrapper, also die DesignCAD_TLB.pas oder die Typbibliothek. Nur wie stelle ich es in Lazarus nur mit der Typbibliothek an?
Für die SharpDevelop-IDE habe ich mit dem Programm TLBImp.exe aus dem .Net-SDK mir eine dll erzeugt. Die nannte sich automatisch DesignCAD.dll. Diese wiederum konnte ich über "Referenzen" dem VB.Net-Projekt hinzufügen. Wie geht das in Lazarus? Ich bin den "Umweg" über Delphi gegangen um mir die Unit zu generieren. Nur wenn man Delphi nicht zur Verfügung hat?

Gruß und vielen Dank nochmal

Volker

hotzenplotz
Beiträge: 33
Registriert: So 13. Dez 2009, 16:17

Re: Problem mit GetActiveOleObject

Beitrag von hotzenplotz »

ErnstVolker hat geschrieben:Hallo Hotzenplotz,
Aber 1.000 Dank!!!!!
Du hattest Recht!!!!
So DcApp:= GetActiveOleObject('DesignCAD.Application') as IDcadApp; gehts!!!!!

Wie geht das in Lazarus? Ich bin den "Umweg" über Delphi gegangen um mir die Unit zu generieren. Nur wenn man Delphi nicht zur Verfügung hat?

Gruß und vielen Dank nochmal

Volker


Kein Problem Ernst!

Ich versteh jetzt aber nicht ganz warum du eine DLL generiert hast. Es existiert doch ech schon eine. Die kannst du so wie sie ist in dein VB.NET einbinden ;)
Mit Lazarus ist es noch so eine Sache. Es gibt bis jetzt KEINE Möglichkeit einen Wrapper zu generieren. Man muss im moment leider noch Delphi zu hilfe nehmen.
Aber wenn du die *_TLB.pas einmal generiert hast, kannst du die leicht zu Lazarus portieren.
Mischen Sie Sich ein! Machen Sie mit! ödp www.ödp.de - Die Öko-Demokraten

ErnstVolker
Beiträge: 336
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Problem mit GetActiveOleObject

Beitrag von ErnstVolker »

Hallo Hotzenplotz,

ja für Microsoft Visual Studio Express Edition brauchte ich die DLL nicht. Da ging das Hinzufügen der Referenz einfach so. Bei #develop nicht. Hier hab' ich nach Forums- und Tutorial lesen diesen Weg herausgefunden. Diese dll die schon im DC-Verzeichnis steckt, wollte er nicht. Die nennt sich Dcad17de.dll. Die wird das wohl sein. An die kam ich auch mit dem OLE-Viewer nicht heran. Die Typbibliothek konnte ich mit OLEview angucken, die dll nicht.

Gruß

Volker

Antworten