OCX für alle Benutzer registrieren

Nutzung, Komponenten, .NET

Moderator: Moderatoren

Antworten
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

OCX für alle Benutzer registrieren

Beitrag von Werner_Bayern »

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!
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2932
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

Beitrag von Wolfgang Ciriack »

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.
Viele Grüße
Wolfgang
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: OCX für alle Benutzer registrieren

Beitrag von Werner_Bayern »

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.
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: OCX für alle Benutzer registrieren

Beitrag von Tom »

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.
Herzlich,
Tom
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: OCX für alle Benutzer registrieren

Beitrag von AUGE_OHR »

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.
... und auf dem aktuellen PC den von dort werden DLL, das sind auch OCX, geladen.

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
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: OCX für alle Benutzer registrieren

Beitrag von Werner_Bayern »

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.
Servus Tom,

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!>
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: OCX für alle Benutzer registrieren

Beitrag von Werner_Bayern »

p.s. was aus M$Comctl.OCX verwendest du ?
Servus Jimmy,

es geht um die Statusbar.

Danke.
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
michael32710
UDF-Programmierer
UDF-Programmierer
Beiträge: 76
Registriert: Sa, 17. Nov 2007 11:02
Wohnort: Niedersachsen
Kontaktdaten:

Re: OCX für alle Benutzer registrieren

Beitrag von michael32710 »

Hallo,
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
OcxRegister.zip
OcxRegister-Sourcen
(10.65 KiB) 355-mal heruntergeladen
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: OCX für alle Benutzer registrieren

Beitrag von AUGE_OHR »

hi,
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"
danke für dein Sample.

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
Antworten