![]() |
.tlb, ActiveX-Bibliothek, "Schnittstelle nicht unterstü
Hallo DPler,
Mit einer, aus einer tlb-Datei erstellten, DLL bekomme ich immer den Fehler "Schnittstelle nicht unterstützt", wenn ich das Prog auf einen Rechner ausführe wo ich die DLL NICHT erstellt habe!?! WIESO :?: :wall: :?: In der Dokumentation stand folgendes zum benutzen der tlb-Datei: Zitat:
1. Datei -> Neu -> Weitere -> ActiveX -> ActiveX-Bibliothek (Ist das überhaupt richtig?) 2. Projekt -> Typenbibliothek importieren -> Hinzufügen -> <.tlb-Datei ausgewählt> -> Unit anlegen (EFilm_TLB.pas erstellt) 3. Projekt -> compilieren Und fertig ist die DLL... Jetzt habe ich ein neues Projekt erstellt um das Ganze zu testen. Dazu habe ich TDocument aus EFilm_TLB.pas benutzt
Delphi-Quellcode:
procedure Test;
var blah: TDocument; begin RegisterOCX('C:\EFilm.dll');//aus der DP blah := TDocument.Create(nil); try blah.Connect;//HIER KOMMT "SCHNITTSTELLE NICHT UNTERSTÜTZT" WENN DAS PROG AUF EINEN RECHNER AUSGEFÜHRT WIRD WO DIE DLL NICHT ERSTELLT WURDE! blah.oleShowMainWindow(SW_MAXIMIZE); //usw... finally blah.Free; end; end; Ich hoffe ihr könnt mir helfen. Gottes Segen |
Re: .tlb, ActiveX-Bibliothek, "Schnittstelle nicht unte
Hallo.
Ich verstehe nicht so richtig warum du so vorgehst. Wenn du eine TLB-Datei zur Verfügung hast, dann kannst du diese in Delphi importieren. Die enthaltenenen Objekte und Schnittstellen werden durch eine bestimmte DLL implementiert - wenn du den Import mit TLIBIMP vorbereitest, dann wird dir die notwendige DLL im Header angegeben. Für die Programmierung brauchst du die Unit EFILM.PAS und zur Laufzeit die zugehörige Support-DLL. Wenn du diese DLL nicht weitergeben darfst, dann hast du ein Lizenz-Problem. Welche Bedeutung soll die von dir erstellte DLL haben? Grüße vom marabu |
Re: .tlb, ActiveX-Bibliothek, "Schnittstelle nicht unte
Zitat:
Zitat:
Zitat:
Eine EFILM.PAS habe ich nicht, oder meinst du die von Delphi erzeugte EFILM_TLB.PAS? Danke für deine Hilfe Gottes Segen |
Re: .tlb, ActiveX-Bibliothek, "Schnittstelle nicht unte
Zur Erstellung deines Programms wird nur die support dll gebraucht, und das nur zur Laufzeit. Entwickeln kannst du deinen Code mit der Unit EFILM.PAS oder EFILM_TLB.PAS - wie es dir gefällt. Dein Programm wird dann nur funktionieren, wenn die support dll auf der Zielmaschine vorhanden ist. Diese heißt vermutlich EFILM.DLL und existiert bereits. Wenn nicht, dann musst du mal den Header von EFILM.PAS zeigen.
Da du die Datei EFILM.PAS schon erzeugt hast, brauchst du TLIBIMP nicht mehr. Alternativ zur IDE kannst du nämlich mit "TLIBIMP -Fe- EFILM.TLB" auf der Kommandozeilen-Ebene die Unit für Delphi erstellen. marabu |
Re: .tlb, ActiveX-Bibliothek, "Schnittstelle nicht unte
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo marabu,
ich hab mal die durch "Typenbibliothek importieren"-erzeugte efilm_tlb.pas angehängt. Diese EFilm_tlb.pas hab ich ja dann auch genutzt nur war mir unklar warum es auf den einen Rechner lief und auf den anderen Rechner nicht?! :gruebel: Meinst du mit support DLL die DLL die ich erzeugt habe? Sonst sind noch efDICOM.dll, efCommon.dll und DICOMDLL.dll im Programmpfad von EFilm vorhanden. Ich hab auch das Beispiel Projekt hinzugefügt, vielleicht ist es behilflich. Mir war es das nicht, da meine C++ Kenntnisse quasi nicht vorhanden sind... Gottes Segen |
Re: .tlb, ActiveX-Bibliothek, "Schnittstelle nicht unte
Die erzeugt *_TLB.pas Datei ist nur ein wrapper für Delphi. In den Dateien
Zitat:
|
Re: .tlb, ActiveX-Bibliothek, "Schnittstelle nicht unte
Zitat:
Muss ich den irgendwas Registrieren bevor ich die meine funktionen benutzen kann? Nur hab ich das ja auch nicht auf den Rechnern gemacht wo ich die DLL erstellt hab?! TIA be blessed |
Re: .tlb, ActiveX-Bibliothek, "Schnittstelle nicht unte
Es kommt darauf an ob du die TLB aus der DLL oder oder vom installierten ActiveX gemacht hast. Beim 2. Fall muß die dll beim OS registriert werden (regsvr32)
|
Re: .tlb, ActiveX-Bibliothek, "Schnittstelle nicht unte
Zitat:
Ich bin eben einmal so vorgegangen wie marabu es gesagt hat. Also ich hab nur ein Projekt erstellt und die tlb importiert. Sprich ohne eine DLL zu erzeugen. Dies hat funktioniert! ABER: wieder nur auf den Rechner wo ich das Project erstellt habe?! :wall: :wall: :wall: Ich hab auch versucht mittels folgender Procedure die 3 DLLs von efilm zu registrieren aber keine hatte die "DllRegisterServer"-Procedure
Delphi-Quellcode:
So langsam gehen mir die Rechner aus....
procedure RegOCX(AFile: String);
var hLib: Cardinal; proc: function: HRESULT; begin hLib := LoadLibrary(PChar(AFile)); if hLib = INVALID_HANDLE_VALUE then RaiseLastOSError; try proc := GetProcAddress(hLib, 'DllRegisterServer'); if @proc <> nil then OleCheck(proc); finally FreeLibrary(hLib); end; end; |
Re: .tlb, ActiveX-Bibliothek, "Schnittstelle nicht unte
Kopier die DLLs auf den Zielrechner ins Systemverzeichnis und registrier sie mit regsrv32 meine.dll.
|
Re: .tlb, ActiveX-Bibliothek, "Schnittstelle nicht unte
Zitat:
Der einzige Unterschied zwischen den Rechnern wo es funktioniert und wo nicht, ist dass die tlb-Datei mit Delphi importiert worden ist. Was macht Delphi also noch wenn man eine tlb-Datei importiert :?: |
Re: .tlb, ActiveX-Bibliothek, "Schnittstelle nicht unte
Zitat:
it's urgent :stupid: be blessed |
Re: .tlb, ActiveX-Bibliothek, "Schnittstelle nicht unte
Es wird ein Installationsproblem sein. Wurde eFilm bzw. DICOM denn auf beiden Maschinen ordentlich per Setup installiert? Sind denn alle Schnittstellen aus EFILM_TLB.PAS auch in der Registrierdatenbank (HKCR) zu finden?
Grüße vom marabu |
Re: .tlb, ActiveX-Bibliothek, "Schnittstelle nicht unte
Zitat:
Zitat:
ich hab gerade mal nachgeschaut mit folgendem Ergebnis: Wo es funktioniert (EFilm.tlb über Projekt|Typenbibliothek importieren importiert)
Code:
LIBID_EFilm: TGUID = '{C8CF03E5-FD1F-11D3-8C03-0080C8D3C5D3}';
HKEY_CLASSES_ROOT\Interface\{C8CF03E6-FD1F-11D3-8C03-0080C8D3C5D3}\TypeLib -> (Standard) HKEY_CLASSES_ROOT\TypeLib\{C8CF03E5-FD1F-11D3-8C03-0080C8D3C5D3} HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Interface\{C8CF03E6-FD1F-11D3-8C03-0080C8D3C5D3}\TypeLib -> (Standard) HKEY_LOCAL_MACHINE\SOFTWARE\Classes\TypeLib\{C8CF03E5-FD1F-11D3-8C03-0080C8D3C5D3} DIID_IEFilm: TGUID = '{C8CF03E6-FD1F-11D3-8C03-0080C8D3C5D3}'; HKEY_CLASSES_ROOT\Interface\{C8CF03E6-FD1F-11D3-8C03-0080C8D3C5D3} HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Interface\{C8CF03E6-FD1F-11D3-8C03-0080C8D3C5D3} CLASS_Document: TGUID = '{C8CF03E4-FD1F-11D3-8C03-0080C8D3C5D3}'; HKEY_CLASSES_ROOT\CLSID\{C8CF03E4-FD1F-11D3-8C03-0080C8D3C5D3} HKEY_CLASSES_ROOT\EFilm.Document\CLSID -> (Standard) HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{C8CF03E4-FD1F-11D3-8C03-0080C8D3C5D3} HKEY_LOCAL_MACHINE\SOFTWARE\Classes\EFilm.Document\CLSID -> (Standard) WO ES NICHT FUNKTIONIERT! (tlb nicht importiert - TestApp bringt "Schnittstelle nicht unterstützt")
Code:
Also muss doch Delphi die tlb registrieren?!!?
LIBID_EFilm: TGUID = '{C8CF03E5-FD1F-11D3-8C03-0080C8D3C5D3}';
-NICHTS GEFUNDEN- DIID_IEFilm: TGUID = '{C8CF03E6-FD1F-11D3-8C03-0080C8D3C5D3}'; -NICHTS GEFUNDEN- CLASS_Document: TGUID = '{C8CF03E4-FD1F-11D3-8C03-0080C8D3C5D3}'; HKEY_CLASSES_ROOT\CLSID\{C8CF03E4-FD1F-11D3-8C03-0080C8D3C5D3} HKEY_CLASSES_ROOT\EFilm.Document\CLSID -> (Standard) HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{C8CF03E4-FD1F-11D3-8C03-0080C8D3C5D3} HKEY_LOCAL_MACHINE\SOFTWARE\Classes\EFilm.Document\CLSID -> (Standard) Wie kann ich das zur Laufzeit registrieren?? RegisterComServer(const DLLName: String); Ist es sicher nicht, denn ich hab keine DLL. RegisterAsService(const ClassID, ServiceName: string); Ist es auch nicht, oder? ich hab ja kein Schlüssel "AppId" gefunden. Welche ist es dann? :roteyes: :nerd: :smile2: :spin: :freak: :stupid: :cry: TIA Gottes Segen |
Re: .tlb, ActiveX-Bibliothek, "Schnittstelle nicht unte
:bouncing4: :bounce2:
Folgende Prozedure löst mein Problem:
Delphi-Quellcode:
Damit kann ich zur Laufzeit die tlb registrieren. D.h. allerdings das ich die tlb mitliefern muss und bei der Installation registrieren muss. Danach kann ich die tlb aber wie löschen. :roll:
procedure RegisterTLB(FileName: String);
var WFileName, DocName: WideString; TypeLib: ITypeLib; LibAttr: PTLibAttr; DirBuffer: array[0..MAX_PATH] of char; begin if ExtractFilePath(FileName) = '' then begin GetCurrentDirectory(SizeOf(DirBuffer), DirBuffer); FileName := '\' + FileName; FileName := DirBuffer + FileName; end; if not FileExists(FileName) then raise Exception.CreateFmt('Datei "%s" nicht gefunden. Registrierung fehlgeschlagen!', [FileName]); WFileName := FileName; OleCheck(LoadTypeLib(PWideChar(WFileName), TypeLib)); OleCheck(TypeLib.GetLibAttr(LibAttr)); try OleCheck(TypeLib.GetDocumentation(-1, nil, nil, nil, @DocName)); DocName := ExtractFilePath(DocName); OleCheck(RegisterTypeLib(TypeLib, PWideChar(WFileName), PWideChar(DocName))); finally TypeLib.ReleaseTLibAttr(LibAttr); end; end; Nungut, Danke für eure Hilfe |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:30 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz