OCX für alle Benutzer registrieren
Moderator: Moderatoren
- Werner_Bayern
- Der Entwickler von "Deep Thought"
- Beiträge: 2125
- Registriert: Sa, 30. Jan 2010 22:58
- Wohnort: Niederbayern
- Hat sich bedankt: 30 Mal
- Danksagung erhalten: 75 Mal
OCX für alle Benutzer registrieren
Servus,
wie macht ihr das, wenn z. B. per RDP gearbeitet wird und dann für jeden Benutzer mit Adminrechten das msComCtl.ocx registriert werden müsste??? Bei 40 Benutzern unmöglich für den Admin...
Mit regsvr32 gehts ja nur für den aktuellen Benutzer.
Danke!
wie macht ihr das, wenn z. B. per RDP gearbeitet wird und dann für jeden Benutzer mit Adminrechten das msComCtl.ocx registriert werden müsste??? Bei 40 Benutzern unmöglich für den Admin...
Mit regsvr32 gehts ja nur für den aktuellen Benutzer.
Danke!
es grüßt
Werner
<when the music is over, turn off the lights!>
Werner
<when the music is over, turn off the lights!>
- Wolfgang Ciriack
- Der Entwickler von "Deep Thought"
- Beiträge: 2935
- Registriert: Sa, 24. Sep 2005 9:37
- Wohnort: Berlin
- Hat sich bedankt: 13 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: OCX für alle Benutzer registrieren
Ich mache das für ein CodeJock.ocx aus dem Programm heraus, benutze dafür aber eine Funktion von eXPress++.
M.E. habe ich auch in irgendwo mal ein paar Dll-Aufrufe gesehen, mit denen das zu bewerkstelligen ist, weiss aber nicht mehr wo.
M.E. habe ich auch in irgendwo mal ein paar Dll-Aufrufe gesehen, mit denen das zu bewerkstelligen ist, weiss aber nicht mehr wo.
Viele Grüße
Wolfgang
Wolfgang
- Werner_Bayern
- Der Entwickler von "Deep Thought"
- Beiträge: 2125
- Registriert: Sa, 30. Jan 2010 22:58
- Wohnort: Niederbayern
- Hat sich bedankt: 30 Mal
- Danksagung erhalten: 75 Mal
Re: OCX für alle Benutzer registrieren
Servus Wolfgang,
habe im Internet nichts gefunden, das eine OCX für alle Benutzer registriert. Lediglich ein Tool aus Delphi, jedoch ist dieses nicht frei verfügbar. Soweit ich gelesen habe, müsste das in hkey_classes_root anstatt beim user geschehen. Aber was ist da wie einzutragen?
Leider hat diesbezüglich regsvr32 keinerlei Optionen.
habe im Internet nichts gefunden, das eine OCX für alle Benutzer registriert. Lediglich ein Tool aus Delphi, jedoch ist dieses nicht frei verfügbar. Soweit ich gelesen habe, müsste das in hkey_classes_root anstatt beim user geschehen. Aber was ist da wie einzutragen?
Leider hat diesbezüglich regsvr32 keinerlei Optionen.
es grüßt
Werner
<when the music is over, turn off the lights!>
Werner
<when the music is over, turn off the lights!>
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9361
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 101 Mal
- Danksagung erhalten: 361 Mal
- Kontaktdaten:
Re: OCX für alle Benutzer registrieren
Such mal im MSDN nach "DllRegisterClient". Da findest Du ein VB-Beispiel, mit dem Du OCX per API registrieren kannst.
Das Mittel der Wahl ist aber eigentlich eine Installationsroutine, die das abwickelt. Die üblichen Setup-Programme beherrschen das.
Das Mittel der Wahl ist aber eigentlich eine Installationsroutine, die das abwickelt. Die üblichen Setup-Programme beherrschen das.
Herzlich,
Tom
Tom
- AUGE_OHR
- Marvin
- Beiträge: 12906
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 45 Mal
Re: OCX für alle Benutzer registrieren
... und auf dem aktuellen PC den von dort werden DLL, das sind auch OCX, geladen.Werner_Bayern hat geschrieben:wie macht ihr das, wenn z. B. per RDP gearbeitet wird und dann für jeden Benutzer mit Adminrechten das msComCtl.ocx registriert werden müsste??? Bei 40 Benutzern unmöglich für den Admin...
Mit regsvr32 gehts ja nur für den aktuellen Benutzer.
wenn Tom sagt per Setup dann muss das aber trotzdem noch vom Administrator gemacht werden, oder überlasst ihr das dem User ?
wenn die User nun ihren Desktop Server 2008 basierend haben kann der Administrator so etwas nachts, wenn kein User online was zu suchen hat, die Gruppenrichtlinien hoch setzten und remote die Update fahren ... Hauptsache er vergisst dann nicht alles wieder zurück zu setzten
p.s. was aus M$Comctl.OCX verwendest du ?
gruss by OHR
Jimmy
Jimmy
- Werner_Bayern
- Der Entwickler von "Deep Thought"
- Beiträge: 2125
- Registriert: Sa, 30. Jan 2010 22:58
- Wohnort: Niederbayern
- Hat sich bedankt: 30 Mal
- Danksagung erhalten: 75 Mal
Re: OCX für alle Benutzer registrieren
Servus Tom,Tom hat geschrieben:Such mal im MSDN nach "DllRegisterClient". Da findest Du ein VB-Beispiel, mit dem Du OCX per API registrieren kannst.
Das Mittel der Wahl ist aber eigentlich eine Installationsroutine, die das abwickelt. Die üblichen Setup-Programme beherrschen das.
danke, werd ich machen. Ich habe mir jetzt Setup Factory 9 lizenziert, ist ein mächtiges Tool, wird noch Monate dauern, bis ich mich da einigermaßen eingelesen habe. Das Setup müsste halt vorher prüfen, ob ein MS-Office installiert ist, denn dann ist das ocx nicht notwendig (es geht um die Statusbar).
es grüßt
Werner
<when the music is over, turn off the lights!>
Werner
<when the music is over, turn off the lights!>
- Werner_Bayern
- Der Entwickler von "Deep Thought"
- Beiträge: 2125
- Registriert: Sa, 30. Jan 2010 22:58
- Wohnort: Niederbayern
- Hat sich bedankt: 30 Mal
- Danksagung erhalten: 75 Mal
Re: OCX für alle Benutzer registrieren
Servus Jimmy,p.s. was aus M$Comctl.OCX verwendest du ?
es geht um die Statusbar.
Danke.
es grüßt
Werner
<when the music is over, turn off the lights!>
Werner
<when the music is over, turn off the lights!>
- michael32710
- UDF-Programmierer
- Beiträge: 76
- Registriert: Sa, 17. Nov 2007 11:02
- Wohnort: Niedersachsen
- Kontaktdaten:
Re: OCX für alle Benutzer registrieren
Hallo,
ich habe den obigen Hinweis von Tom bzgl. VB-Sample mal aufgegriffen und ein entsprechendes Xbase++ Sample erstellt.
Liebe Grüße
Michael
ich habe den obigen Hinweis von Tom bzgl. VB-Sample mal aufgegriffen und ein entsprechendes Xbase++ Sample erstellt.
Liebe Grüße
Michael
Code: Alles auswählen
// OCXREGISTER.PRG
// ----------------------------------------------------------------------------
// OcxRegister registriert und deregistriert ActiveX-DLLs und OCX-Dateien
// Das Programm ist inspiriert durch das MSDN VB-Sample von Mathias Schiffer
// siehe: http://msdn.microsoft.com/de-de/library/bb978981.aspx
//
// Copyright (C) 2012 Michael Paetzold. GPLv3.
//
// This program is free software; you can redistribute it and/or modify it
// under the terms of the GNU General Public License as published by the Free
// Software Foundation; either version 3 of the License, or (at your option)
// any later version.
//
// This program is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
// more details.
//
// You should have received a copy of the GNU General Public License along with
// this program; if not, see http://www.gnu.org/licenses/.
// ----------------------------------------------------------------------------
#include "common.ch"
#include "dll.ch"
#define WAIT_RESULT_0 0x0
function RegisterServer(cFqn, lRegister, nTimeOut) //______________________
// registriert oder deregistriert eine ActiveX-DLL oder eine OCX
//
// cFqn FullQualified-Filename der ActiveX-DLL oder der OCX
//
// [lRegister] .T. fuer registrieren.
// .F. fuer deregistrieren.
// Defaultwert: .T.
//
// [nTimeOut] Zeit in Milli-Sekunden, die maximal auf den Vorgang verwendet
// werden soll.
// Defaultwert: 5000 Milli-Sek.
//
// Rueckgabewert
// lRegisterServer: .T. bei erfolgreicher, .F. bei erfolgloser Aktion.
local lRegisterServer := .F.
local nModulHandle
local nProcAddress
local hThread
local nThreadId := 0
local lResult
local nExitCode := 0
DEFAULT lRegister TO .T.
DEFAULT nTimeOut TO 5000
begin sequence
// die angegebene Datei als Modul laden
nModulHandle := LoadLibrary(cFqn)
// Abbruch wenn erfolglos
If nModulHandle = 0
break()
EndIf
// die Adresse der Funktionen DllRegisterServer (bzw. DllUnregisterServer) ermitteln
nProcAddress := GetProcAddress(nModulHandle, IIf(lRegister, "DllRegisterServer", "DllUnregisterServer"))
// Abbruch wenn erfolglos
If nProcAddress = 0
FreeLibrary(nModulHandle) // geladenes Modul freigeben
break()
EndIf
// die Funktion ueber ProcAddress aufzurufen
hThread := CreateThread(0, 0, nProcAddress, 0, 0, @nThreadId)
// Abbruch wenn erfolglos
If hThread = 0
FreeLibrary(nModulHandle) // geladenes Modul freigeben
break()
EndIf
// auf Execution warten
lResult := WaitForSingleObject(hThread, nTimeOut)
// bei WAIT_RESULT_0 war Execution Ok
If lResult = WAIT_RESULT_0
// ExitCode des Threads ermitteln
GetExitCodeThread( hThread, @nExitCode)
// bei 0 war die Aktion der aufgerufenen Funktion erfolgreich
If nExitCode = 0
lRegisterServer := .T.
EndIf
EndIf
CloseHandle(hThread ) // Handle auf Thread freigeben
FreeLibrary(nModulHandle) // geladenes Modul freigeben
end sequence
return lRegisterServer // CREATED 16062012 ________________________________
function LoadLibrary(cFqn) //______________________________________________
// laedt Library
local nModulHandle:=0 // Handle auf das Module
DEFAULT cFqn TO ""
nModulHandle := DllCall( "KERNEL32.Dll", DLL_STDCALL, "LoadLibraryA", cFqn )
return nModulHandle //_ CREATED 16062012 __________________________________
function FreeLibrary(nModulHandle) //______________________________________
// entlaedt Library
local nResult
nResult := DllCall( "KERNEL32.Dll", DLL_STDCALL, "FreeLibrary", nModulHandle )
return nResult //______ CREATED 16062012 __________________________________
function GetProcAddress(nModulHandle, cProcName) //________________________
// holt Procedure-Adresse
local nProcAddress
nProcAddress := DllCall( "KERNEL32.Dll", DLL_STDCALL, "GetProcAddress", nModulHandle, cProcName)
return nProcAddress //_ CREATED 16062012 __________________________________
function CreateThread(nThreadAttr, nStackSize, nStartAddress, nParm, nCreationFlag, nThreadID)
// erzeugt Thread
local nThreadHandle
nThreadHandle := DllCall( "KERNEL32.Dll", DLL_STDCALL, "CreateThread", nThreadAttr, nStackSize, nStartAddress, nParm, nCreationFlag, @nThreadID)
return nThreadHandle//_ CREATED 16062012 __________________________________
function GetExitCodeThread(hThread, nExitCode) //__________________________
// holt ExitCode
local nResult
nExitCode := 0
nResult := DllCall( "KERNEL32.Dll", DLL_STDCALL, "GetExitCodeThread", hThread, @nExitCode)
return nExitCode //____ CREATED 16062012 __________________________________
function WaitForSingleObject(hObject, nTimeOut) //__________________________
// wartet auf Execution
local nResult := 0
nResult := DllCall( "KERNEL32.Dll", DLL_STDCALL, "WaitForSingleObject", hObject, nTimeOut)
return nResult //______ CREATED 16062012 __________________________________
function CloseHandle(hObject) //___________________________________________
// schliesst Handle
local nResult
nResult := DllCall( "KERNEL32.Dll", DLL_STDCALL, "CloseHandle", hObject )
return nResult //______ CREATED 16062012 __________________________________
///////// Unit Test ///////////////////////////////////////////////////////
#IFDEF OCXREGISTER
procedure main //__________________________________________________________
// Unit-Test fuer RegisterServer
// WICHTIGER Hinweis: Die Datei RICHTX32.OCX von Microsoft wird benoetigt.
test_RegisterServer()
qout( "" )
qout( "Ende mit Taste" )
inkey(0)
return //______________ CREATED 16062012 __________________________________
function test_RegisterServer() //__________________________________________
// testet RegisterServer mit RichTx32.ocx
local lSuccess:= .F.
local cLibraryFile := "RichTx32.ocx"
local cLibraryPath := "c:\windows\system32" // "c:\windows\system32"
local cFqn := cLibraryPath+"\"+cLibraryFile
if isRichTx32()
lSuccess := RegisterServer(cFqn, .F.) // ocx abschalten
Qout('RegisterServer("DeRegister")', cFqn, lSuccess)
endif
Qout('isRichTx32()', isRichTx32())
inkey(0)
lSuccess := RegisterServer(cFqn, .T.) // ocx einschalten
Qout('RegisterServer("Register")', cFqn, lSuccess)
Qout('isRichTx32()', isRichTx32())
inkey(0)
return .T. //__________ CREATED 16062012 __________________________________
function isRichTx32() //___________________________________________________
// prueft, ob RichTx32.Ocx-Funktionalitaeten in XbpRTF() funktioniern
// dazu benoetigt XbpRTF() die registierte RichTx32.Ocx
local lActive := .F.
local cString
local cRtfTest
local bOldError:= Errorblock( {|o| Break(o) } )
local oErr
begin sequence
// RTF-Beispiel-String
cRtfTest := "{\rtf1\fbidis\ansi\deff0{\fonttbl{\f0\fswiss\fprq2\fcharset0 Calibri;}{\f1\fswiss\fprq2\fcharset0 Arial;}}" ;
+"\viewkind4\uc1\pard\ltrpar\tx283\tx566\tx850\tx1133\tx1417\tx1700\tx1984\tx2267\tx2551\tx2834\lang1031\f0\fs22 ";
+"OcxTest\f1\fs20\par}"
// mit dem Aufruf der Funktion pullPlainTextFromRTF() wird die Funktionalitaet von XbpRTF() geprueft
//..................
cString := pullPlainTextFromRTF(cRtfTest)
//..................
lActive := (cString=="OcxTest")
recover using oErr
end sequence
Errorblock( bOldError )
return lActive //______ CREATED 16062012 __________________________________
function pullPlainTextFromRTF(cRtfString) //_______________________________
// zieht den eigentlichen Content aus einem RTF-String heraus
// ACHTUNG: RichTx32.Ocx wird benoetigt und muss bei Windows registriert sein
local cPlainText
local oRTF
if .not. (ValType(cRtfString)=="C" .or. ValType(cRtfString)=="M")
cRtfString:=""
endif
cPlainText := cRtfString
if Lower(Left(cRtfString, 5)) == "{\rtf" // is RTF ?
oRTF := XbpRTF():new(,,,,,.F.)
oRTF:create()
oRTF:textRTF:= cRtfString
cPlainText := oRTF:text
endif
return cPlainText //___ CREATED 16062012 __________________________________
#ENDIF
- AUGE_OHR
- Marvin
- Beiträge: 12906
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 45 Mal
Re: OCX für alle Benutzer registrieren
hi,
Der "normale" User hat aber unter Win7/8 nicht die Rechte um ein OCX nach %windir%\system32 zu kopieren zwecks "Registrierung".
wenn es nun um MsComCtl.OCX geht habe ich ja nun die "native" Versionen in der DXE LIB umgesetzt ( s.h. Wissensbasis).
Da muss man dann nichts mehr "registrieren"
danke für dein Sample.michael32710 hat geschrieben:ich habe den obigen Hinweis von Tom bzgl. VB-Sample mal aufgegriffen und ein entsprechendes Xbase++ Sample erstellt.Code: Alles auswählen
local cLibraryFile := "RichTx32.ocx" local cLibraryPath := "c:\windows\system32" // "c:\windows\system32"
Der "normale" User hat aber unter Win7/8 nicht die Rechte um ein OCX nach %windir%\system32 zu kopieren zwecks "Registrierung".
wenn es nun um MsComCtl.OCX geht habe ich ja nun die "native" Versionen in der DXE LIB umgesetzt ( s.h. Wissensbasis).
Da muss man dann nichts mehr "registrieren"
gruss by OHR
Jimmy
Jimmy