ActiveX DLL verwenden

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Lebostein
Beiträge: 674
Registriert: 13.09.2004 11:31
Wohnort: Erzgebirge

Beitrag 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
Benutzeravatar
Lebostein
Beiträge: 674
Registriert: 13.09.2004 11:31
Wohnort: Erzgebirge

Beitrag 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?
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag 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
Zuletzt geändert von mk-soft am 29.06.2006 19:06, insgesamt 1-mal geändert.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag 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:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Lebostein
Beiträge: 674
Registriert: 13.09.2004 11:31
Wohnort: Erzgebirge

Beitrag 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
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag 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
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten