Benutzer mit den meisten Antworten
VB 2008 Express: OLE-Server (EXE) erstellen

Frage
-
Hallo,
ich verwende ein von mir noch vor Jahren unter VB4 Professional Edition (16-Bit) erstellten OLE-Server (EXE) um im Büro (Windows XP) unter Excel 2003 (über die VBA-Funktion CreateObject) diverse Spezialberechnungen vorzunehmen. Die Büro-PCs sollen jetzt auf Windows 7 und Excel 2010 umgestellt werden. Die alte VB4-Anwendung ist dann nicht mehr lauffähig (lässt sich nicht mehr unter Win7 installieren). Ich habe das Project jetzt mühsam auf VB 2008 Express portiert. Allerdings bekomme ich VB 2008 nicht dazu, dass das Modul mit der Anweisung "Public Class Steuer" in der Registry mit einer CLSID registiert (also für alle anderen Windows-Anwendungen sichtbar) wird. In VB4 gab es die Class-Eigenschaft "Createable - Multiuse", um eine Klasse zu exportieren. Was muss ich dazu in VB 2008 Express einstellen?
Die von VB 2008 Express erstellten EXE-Dateien werden vom SETUP nicht als "normale" Anwendungen im Programm-Ordner installiert, sondern unter C:\Dokumente und Einstellungen\UserName\Lokale Einstellungen\Apps\2.0\XXX\XXX\XXXX..tion_6e(hex)_7a(hex)\XXX.EXE. Damit sind die Programme nicht Maschinenbezogen sondern Userbezogen verfügbar. Eine so installierte Anwendung kann so vermutlich auch nicht als OLE-Server in der Registry unter CLSID eingetragen werden, da ja nur derjenige User auf diesen Ordner Zugriff hat, der sie auch installiert hat. Ist es mit VB 2008 Express überhaupt möglich, eine EXE-Datei zu erstellen, die als OLE-Server in der Registry eingetragen ist und deren Funktionalität von anderen Anwendungen (OLE-Clients) genutzt werden kann?
Unter WinXP sieht der Registry-Eintrag für meine alte VB4-16-Bit-Anwendung momentan so aus:
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Steuerberechnung.Steuer]="Steuerberechnung"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Steuerberechnung.Steuer\Clsid]="{DF91A550-69B8-1029-8931-4E2AF6659732}"
[HKEY_CLASSES_ROOT\CLSID\{DF91A550-69B8-1029-8931-4E2AF6659732}]="Steuerberechnung"
[HKEY_CLASSES_ROOT\CLSID\{DF91A550-69B8-1029-8931-4E2AF6659732}\InprocHandler]="OLE2.DLL"
[HKEY_CLASSES_ROOT\CLSID\{DF91A550-69B8-1029-8931-4E2AF6659732}\LocalServer]="C:\\Progamme\\SteuerTool\\STEUER.EXE"
[HKEY_CLASSES_ROOT\CLSID\{DF91A550-69B8-1029-8931-4E2AF6659732}\ProgID]="Steuerberechnung.Steuer"
[HKEY_CLASSES_ROOT\CLSID\{DF91A550-69B8-1029-8931-4E2AF6659732}\TypeLib]="{DF91A553-69B8-1029-8931-4E2AF6659732}"
[HKEY_CLASSES_ROOT\Interface\{07CB02E1-F4F5-102E-8931-4E2AF6659732}]="Steuer"
[HKEY_CLASSES_ROOT\Interface\{07CB02E1-F4F5-102E-8931-4E2AF6659732}\ProxyStubClsid]="{00020424-0000-0000-C000-000000000046}"
[HKEY_CLASSES_ROOT\Interface\{07CB02E1-F4F5-102E-8931-4E2AF6659732}\ProxyStubClsid32]="{00020424-0000-0000-C000-000000000046}"
[HKEY_CLASSES_ROOT\Interface\{07CB02E1-F4F5-102E-8931-4E2AF6659732}\TypeLib]="{DF91A553-69B8-1029-8931-4E2AF6659732}"
[HKEY_CLASSES_ROOT\CLSID\{00020424-0000-0000-C000-000000000046}]="PSOAInterface"
[HKEY_CLASSES_ROOT\CLSID\{00020424-0000-0000-C000-000000000046}\InprocServer]="ole2disp.dll"
[HKEY_CLASSES_ROOT\CLSID\{00020424-0000-0000-C000-000000000046}\InprocServer32]="oleaut32.dll"In Excel existiert dann ein Modul, über dass ich die Berechnungen anfordere:
Public objSteuer As Object
Public objSteuerAktiv As Boolean
Function Steuer(Berechnung&, Jahr%, Monat%) As Long
If Not objSteuerAktiv Then
Set objSteuer = CreateObject("Steuerberechnung.Steuer")
VersionMajor% = -1: VersionMinor% = -1
On Error Resume Next
VersionMajor% = objSteuer.VersionMajor
VersionMinor% = objSteuer.VersionMinor
objSteuerAktiv = True
End If '
...
End FunctionIch habe ziemliche Schwierigkeiten mit dem Umstieg von VB4 Professional Edition auf VB 2008 Express, da ich seit der VB4-Programmierzeit keine Erfahrungen mit der Erstellung von 32-Bit-Programmen unter VB5/6 sammeln konnte. Die Dokumentation, Beispielanwendungen und Foren für VB2008 brachten keine Fundstellen für "OLE-Server". Kann mir jemand einen Tipp geben?
Antworten
-
Hallo,
OLE-Server ist eine etwas alte Bezeichnung, die eher aus den Win3.1 Zeiten stammt, zwischenzeitlich nutzt man eher die Bezeichung ActiveX bzw. COM = Component Object Model und über die wirst Du eher fündig.
Siehe Aufrufen einer .NET-Komponente von einer COM-Komponente aus
Olaf Helper
* cogito ergo sum * errare humanum est * quote erat demonstrandum *
Wenn ich denke, ist das ein Fehler und das beweise ich täglich
Blog Xing- Als Antwort vorgeschlagen asd4444b Montag, 14. Mai 2012 10:16
- Als Antwort markiert Robert Breitenhofer Donnerstag, 31. Mai 2012 15:45
Alle Antworten
-
Hallo,
OLE-Server ist eine etwas alte Bezeichnung, die eher aus den Win3.1 Zeiten stammt, zwischenzeitlich nutzt man eher die Bezeichung ActiveX bzw. COM = Component Object Model und über die wirst Du eher fündig.
Siehe Aufrufen einer .NET-Komponente von einer COM-Komponente aus
Olaf Helper
* cogito ergo sum * errare humanum est * quote erat demonstrandum *
Wenn ich denke, ist das ein Fehler und das beweise ich täglich
Blog Xing- Als Antwort vorgeschlagen asd4444b Montag, 14. Mai 2012 10:16
- Als Antwort markiert Robert Breitenhofer Donnerstag, 31. Mai 2012 15:45
-
Hallo VB4ProfessionalEditionUser,
Ich gehe davon aus, dass die Antwort Dir weitergeholfen hat.
Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.Grüße,
RobertRobert Breitenhofer, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können. -
Hallo,
der Hinweis, dass OLE jetzt COM ist, hat schon mal geholfen. Doch leider finde ich kein Beispiel, welche Einstellungen in VB 2008 Express notwendig sind, um den Compiler dazu zu bringen, die Klasse nicht nur sichtbar zu machen (COM-sichtbar = Wahr habe ich eingestellt), sondern auch die notwendigen Eintragungen in der Registry vorzunehmen. Gefunden habe ich nur Beispiele um eine COM-Client-Anwendung zu erstellen, die einen vorhandenen COM-Server ansteuert. Aber ich will ja gerade einen COM-Server erstellen, der seine Funktionalität anderen COM-Clients zur Verfügung stellt. Das Dokument "Aufrufen einer .NET-Komponente von einer COM-Komponente aus" habe ich lange studiert und kann es nicht fassen, dass man nun außerhalb der VB-Entwicklungsumgebung über die Eingabeaufforderung ("DOS-Box") diverse Befehlszeilen (sn, tlbexp, regasm, gacutil) aufrufen muss. Das dortige Beispiel behandelt zwar DLL-COM-Server, obwohl mir ein EXE-COM-Server vorschwebt, den man nicht unbedingt mit "Verweis" in ein Projekt einbinden muss (Early-Binding) sondern über CreateObject z.B. über VBA (Excel) aufrufen kann (Late-Binding). Aber dieses Temperaturumrechnungsbeispiel mit den zwei Properties (Celsius und Fahrenheit) kommt meinen Vorstellung schon recht nahe. Problem: ich bekomme die Registry-Eintragungen nicht zu stande und damit taucht meine Klasse nicht im Verweis-Fenster als Objekt auf.
Kann mir noch jemand die Frage beantworten, warum VB 2008 Express keine EXE-Dateien erzeugt, die unter C:\Programms\ installiert werden, sondern unter C:\Users\UserName1\Apps\2.0\xxxx? Auf diese Anwendungen hat ja nur der Anwender UserName1 Zugriff, der Sie auch installiert hat. Deshalb kann ein so installiertes Programm ja nie über eine CLSID in der Registry eingetragen sein. Oder?
Danke für jeden nützlichen Hinweis!
-
Doch leider finde ich kein Beispiel, welche Einstellungen in VB 2008 Express notwendig sind, um den Compiler dazu zu bringen, die Klasse nicht nur sichtbar zu machen (COM-sichtbar = Wahr habe ich eingestellt), sondern auch die notwendigen Eintragungen in der Registry vorzunehmen.
Hallo VB4ProfessionalEditionUser,
Schau Dir mal folgenden Thread an. Vielleicht kann er Dir weiterhelfen. Da wird eine Technik gezeigt wo man keine Registry braucht, alles aus dem Buch: „. Net and COM Interoperability Handbook“: http://flylib.com/books/en/2.575.1.77/1/
Regfree COM einer .NET-COM-dll mittels Activation Context API unter VB6/VBA
Grüße,
Robert
Robert Breitenhofer, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.