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

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
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

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
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