Autor Beitrag
FinalFantasy
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 127

Windows XP
Delphi 5 Professional, Visual Studio 7 .NET (C#)
BeitragVerfasst: Fr 23.09.05 11:15 
Hi,

ich hole mir via
ausblenden Delphi-Quelltext
1:
2:
p: oleVariant;
p := CreateOleObject('testdll.clsFile');

ein Objekt aus der test.dll.

Dieses Objekt hat die Methode LoadFile, welche eine Datei öffnet und einliest. Zusätzlich gibt es das Event FileLoadProgress(min, act, max: double) welches mir den "Ladestand" geben würde, so dass ich via einer Progressbar den Fortschritt anzeigen könnte (das Laden dauert unter umständen etwas länger).
Die DLL wurde in VB geschrieben.
Ich habe nur absolut keine Ahnung, wie ich dieses Event abfangen kann, so dass ich meine Progressbar aktualisieren könnte. Wie kann man sowas machen, bzw. geht es überhaupt?

Moderiert von user profile iconAXMD: Delphi-Tags hinzugefügt.
Sprint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 849



BeitragVerfasst: Fr 23.09.05 21:45 
Ich würde so vorgehen:

- Delphi 5 Pro starten
- Datei-->Alle schließen
- Datei-->Projekt-->Typbiblieothek importieren
- Hinzufügen
- DLL (testdll.dll) auswählen
- Unit anlegen
- Unit in deinem Verzeichnis speichern

Dein Projekt starten. Die neue Unit (testdll_TLB.pas) in dein Projekt einbinden.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
type
  TForm1 = class(TForm)
  {...}
  private
    { Private-Deklarationen }
    X: TclsFile;
    procedure FileLoadProgress(Sender: TObject; min: Double; act: Double; max: Double);
  {...}
  end;

ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.FileLoadProgress(Sender: TObject; min, act, max: Double);
begin
  // Dein Quelltext
end;

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.FormCreate(Sender: TObject);
begin

  // Klasse aus der VB ActiveX DLL erstellen
  X := TclsFile.Create(nil);

  // Ereignis zuweisen
  X.OnFileLoadProgress := FileLoadProgress;

end;
FinalFantasy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 127

Windows XP
Delphi 5 Professional, Visual Studio 7 .NET (C#)
BeitragVerfasst: Sa 24.09.05 18:01 
Werd ich am Montag mal testen
FinalFantasy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 127

Windows XP
Delphi 5 Professional, Visual Studio 7 .NET (C#)
BeitragVerfasst: Mo 26.09.05 10:11 
Ok, ich hatte die DLL händisch via CreateOleObject geladen, was ja eine ganz andere Art ist.
Ich habe jetzt die DLL so eingefügt, wie du beschrieben hast. Mit ein paar Modifikationen an dem generiertem File, dass die Schnittstellen enthält, habe ich das ganze zum kompilieren gebracht.
Allerdings gibt es ein Problem:
Der Aufruf des Konstruktors, wie du ihn geschrieben hast:
ausblenden Delphi-Quelltext
1:
2:
  // Klasse aus der VB ActiveX DLL erstellen   
  X := TclsFile.Create(nil);

funktioniert nicht. Es gibt in der DLL/Klasse (welche ja in VB geschrieben wurde) kein Create, schon gar nicht als Konstruktor...
Ich hab jetzt also die passenden Typen, nur ich kriege keine Instanz des Objekts zum laufen.

In C würde ja mit dem Statement a = new Ta() automatisch der Konstruktor aufgerufen, wo auch immer der steckt....
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mo 26.09.05 10:25 
Hallo!

Normalerweise ist dann eine CoKlasse in der xxx_TLB.pas vorhanden, die du verwenden kannst. Delphi generiert diese standardmäßig bei jedem ActiveX-Import.

Zum Thema Ereignis und Com/ActiveX/OLE:
Ereignissteuerung geht afaik bei COM-Objekten einzig und allein über Interfaces. Es müsste in der TLB ein Ereignis-Interface definiert sein, daß die von dir erwähnte Methode LoadFileProgress angibt. Dieses Interface muß von deiner Form implementiert werden.

Cu,
Udontknow
FinalFantasy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 127

Windows XP
Delphi 5 Professional, Visual Studio 7 .NET (C#)
BeitragVerfasst: Mo 26.09.05 10:42 
Mhm, stimmt, da gibt es eine CoKlasse. Über diese Klasse kann ich den Create aufrufen, ja?
also mit
ausblenden Delphi-Quelltext
1:
2:
3:
var p: myActiveXClass;

p := CoclsmyActiveXClass.Create();

ja? Ist das so richtig?

Ich kriege so zwar eine Instanz, allerdings stürzt beim ersten Aufruf einer anderen Methode der Klasse mit einer Zugriffsverletzung in MSVBVM60.DLL ab...
Die DLL funktioniert aber! Ich hatte auf meinem PC mit dem selben Windows (alles gleich) das Programm schon mit der DLL am laufen, nur dass ich mir da eben eine Instanz via CreateOleObject(...) besorgt habe.
Sprint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 849



BeitragVerfasst: Mo 26.09.05 11:30 
Häng mal die importierte Unit hier im Thread als Anhang dran.

Zum Thema "Create": TclsFile sollte von TOleServer abgeleitet sein. Und dann geht's auch so wie ich es beschrieben habe.

_________________
Ciao, Sprint.
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mo 26.09.05 11:41 
Ist MyActiveClass der Bezeichner des Interfaces? Es wird ein (Dispatch-) Interface zurückgegeben.

Hmmm, die Coklasse verwendet CreateComObject... Evtl ist das nicht für OLE-Objekte geeignet. Da war doch noch was mit IDispatch-Interfaces... :nixweiss: Das habe ich nie so recht verstanden.

Probiere es dann doch besser über CreateOLEObject und der entsprechenden GUID, die du ja aus der TLB bekommst. Das zurückgegebene IDispatch-interface kannst du dann ja noch über "as" in das benötigte Interface umwandeln.

Cu,
Udontknow