Seite 2 von 2

Verfasst: 29.06.2006 10:49
von ts-soft
>> ollte es das schon gewesen sein? Oder hab ich was übersehen?
Na, die ganzen abc usw. im Interface gegen Aussagekräftige Variablen
austauschen, und Prototypes verwenden (Für die ganzen Unicode Strings)

Also nur noch Fleissarbeit :wink:

Verfasst: 29.06.2006 10:55
von Lebostein
ts-soft hat geschrieben:>> ollte es das schon gewesen sein? Oder hab ich was übersehen?
Na, die ganzen abc usw. im Interface gegen Aussagekräftige Variablen
austauschen, und Prototypes verwenden (Für die ganzen Unicode Strings)
Es ist ja nur für den privaten Gebrauch, die abc's und die ganzen fehlenden Konstanten kann ich ja mit dem Handbuch der Logitech-SDK (http://techlgb.myweb.hinet.net/QCSDKW32.PDF) einfach ableiten, da mach ich mir keine weitere Arbeit damit.
Das mit den Unicode-Strings ist aber ne Sache, die sollte ich mir auf jeden Fall noch mal angucken... mit Prototypes... na mal sehen

Verfasst: 29.06.2006 13:06
von Lebostein
Kann man eigentlich diese Codezeilen:

Code: Alles auswählen

CoInitialize_(#Null)
CoCreateInstance_(?CLSID_VideoPortal, #Null, #CLSCTX_INPROC_SERVER, ?IID_IVideoPortal, @MyPortal.IVideoPortal)
CoUninitialize_()
irgendwie mit dem Aufruf der DLL-Funktion "DllGetClassObject" ersetzen? Bei Microsoft habe ich gelesen "CoCreateInstance lädt Ihre DLL und ruft die spezielle Funktion DllGetClassObject auf". Also könnte ich sie ja gleich selber aufrufen, oder nicht? Dann könnte ich mir auch die An- und Abmeldung der DLL in der Registry über "DllRegisterServer" sparen, weil ich dann nur noch direkt auf die DLL zugreife und mit der Registry überhaupt nicht mehr in Kontakt komme.

Code: Alles auswählen

CallFunction(0, "DllGetClassObject", ?CLSID_VideoPortal, ?IID_IVideoPortal, @MyPortal.IVideoPortal)
Jedenfalls bringt es nicht den erwarteten Erfolg... wo könnte der Fehler liegen?

Verfasst: 29.06.2006 18:58
von mk-soft
Achtung!

mit CallFunction(0, "DllUnregisterServer") ist das ActiveX auch für andere Programme nicht mehr verfügbar

FF :wink:

P.S. *MyPortal.IVideoPortal = CreateObject("...") ; DCOM Objectname

Verfasst: 29.06.2006 19:02
von mk-soft
Die DLL Functionen sind nicht für den Aufruf der Funktionen des ActiveX gedacht. Sondern nur zur Registrierung des ActiveX

Code: Alles auswählen

;-TOP
; Kommentar     : DCOM Object Helper
; Author        : mk-soft
; Second Author : 
; Datei         : ComHelper.pb
; Version       : 1.02
; Erstellt      : 01.05.2006
; Geändert      : 02.05.2006

; -------------------------------------------------------------------

;- Konstanten
#CLSCTX_INPROC_SERVER  = $1
#CLSCTX_INPROC_HANDLER = $2
#CLSCTX_LOCAL_SERVER   = $4
#CLSCTX_REMOTE_SERVER  = $10
#CLSCTX_ALL = (#CLSCTX_INPROC_SERVER|#CLSCTX_INPROC_HANDLER|#CLSCTX_LOCAL_SERVER|#CLSCTX_REMOTE_SERVER)

; -------------------------------------------------------------------

;- Strukturen

; -------------------------------------------------------------------

; Globale Variablen
Global LastError.l
Global LastMessage.s

; -------------------------------------------------------------------

Procedure CreateObject(Object.s, CLSTYPE.l = #CLSCTX_LOCAL_SERVER | #CLSCTX_INPROC_SERVER)

  LastError = 0
  LastMessage = ""
  
  hr = CoInitialize_(0)
  If  hr <> #S_OK And hr <> #S_FALSE
    LastError = hr
    LastMessage = "Error CoInitialize: ErrorCode " + Hex(hr)
    End
  EndIf
  
  hr = CLSIDFromProgID_(Object, CLSID.GUID)
  If hr <> #S_OK
    LastError = hr
    LastMessage = "Error CLSIDFromProgID: ErrorCode " + Hex(hr)
    ProcedureReturn 0
  EndIf
  
  hr = CoGetClassObject_(@CLSID, CLSTYPE, #Null, ?IID_IClassFactory, @pCf.IClassFactory)
  If hr <> #S_OK
    LastError = hr
    LastMessage = "Error CoGetClassObject: ErrorCode " + Hex(hr)
    ProcedureReturn 0
  EndIf
  

  hr = pCf\CreateInstance(#Null, ?IID_IDispatch, @*Object.IDispatch)
  pCf\Release()
  If hr <> #S_OK
    LastError = hr
    LastMessage = "Error CreateInstance: ErrorCode " + Hex(hr)
    ProcedureReturn 0
  Else
    ProcedureReturn *Object
  EndIf
  
EndProcedure

; -------------------------------------------------------------------

Procedure ReleaseObject(*Object.IDispatch)

  If *Object
    *Object\Release()
  EndIf
  
EndProcedure

; ---------------------------------------------------------

;- DataSection IID

DataSection
  
  IID_NULL: ; {00000000-0000-0000-0000-000000000000}
  Data.l $00000000
  Data.w $0000, $0000
  Data.b $00, $00, $00, $00, $00, $00, $00, $00 
  
  IID_IUnknown : ; {00000000-0000-0000-C000-000000000046}'
  Data.l $00000000
  Data.w $0000, $0000, $C000
  Data.b $00 , $00 , $00, $00 , $00 , $46
  
  IID_IDispatch:
  Data.l $00020400
  Data.w $0000, $0000
  Data.b $C0,$00,$00,$00,$00,$00,$00,$46

  IID_IClassFactory:
  Data.l $00000001
  Data.w $0, $0
  Data.b $C0, $0, $0, $0, $0, $0, $0, $46
  
EndDataSection
P.S. Falls ein Container benötigt wird habe ich noch AltHelper.pb dafür

FF :wink:

Verfasst: 30.06.2006 07:34
von Lebostein
@mk-soft: Bei deiner "AltHelper.pb" ist mir aufgefallen, du solltest unbedingt mit dynamischer Indizierung arbeiten! Falls nämlich der Benutzer schon eine DLL mit dem Index 0 geöffnet hat, wird sie durch deine Include einfach überschrieben:

Code: Alles auswählen

Procedure InitAtl()

  If OpenLibrary(0, "ATL.dll") = 0
    LastMessage = "Fehler OpenLibrary"
    LastError = $80080001
    ProcedureReturn 0
  EndIf

  ; Init Functions
  Global AtlAxWinInit.ProtoAtlAxWinInit = GetFunction(0, "AtlAxWinInit")
  Global AtlAxCreateControl.ProtoAtlAxCreateControl = GetFunction(0, "AtlAxCreateControl")
  Global AtlAxGetControl.ProtoAtlAxGetControl = GetFunction(0, "AtlAxGetControl")

  ProcedureReturn 1
  
EndProcedure
so besser:

Code: Alles auswählen

Procedure InitAtl()

  LibID = OpenLibrary(#PB_Any, "ATL.dll")
  If LibID = 0
    LastMessage = "Fehler OpenLibrary"
    LastError = $80080001
    ProcedureReturn 0
  EndIf

  ; Init Functions
  Global AtlAxWinInit.ProtoAtlAxWinInit = GetFunction(LibID, "AtlAxWinInit")
  Global AtlAxCreateControl.ProtoAtlAxCreateControl = GetFunction(LibID, "AtlAxCreateControl")
  Global AtlAxGetControl.ProtoAtlAxGetControl = GetFunction(LibID, "AtlAxGetControl")

  ProcedureReturn 1
  
EndProcedure

Verfasst: 01.07.2006 09:52
von mk-soft
@Lebostein,

Werde ich bei mir gleich einflegen und auf mein WebServer aktuallisieren.

Ok und Danke. Hatte ich nicht dran gedacht.

FF :wink:

EDIT!

Bug in ComHelper gefunden bei DataSection IID_IUnknown -> Update

Code: Alles auswählen

  IID_IUnknown : ; {00000000-0000-0000-C000-000000000046}'
  Data.l $00000000
  Data.w $0000, $0000 
  Data.b $C0, $00, $00 , $00 , $00, $00 , $00 , $46